강의

멘토링

로드맵

인프런 커뮤니티 질문&답변

yongyong213님의 프로필 이미지
yongyong213

작성한 질문수

integerOverFlow 뜨는 이유가 궁금합니다. 1섹션1강

작성

·

219

·

수정됨

0

#include <iostream>
#include <cstdlib>
using namespace std;

1090번 문제 1섹션 1강 완전탐색 강의 5번째 문제입니다.

c++에서 만든 코드입니다. 백준에 제출 했는데 integerOverFlow로 오류가 나옵니다.(예제는 모두 잘 실행됩니다)

int의 범위에서 문제가 생길 것 같은 곳은 long long int 나 arr로 고쳤는데도 런타임 오류가 계속 뜹니다.

도저히 어떤 부분에서 문제가 생기는지 짐작이 안가네요




int main(int argc, char **argv) {
	int n;
  int pointX, pointY; // <- 기준으로 완전 탐색
  int minX, minY, maxX, maxY; //완전 탐색할 범위
  cin >> n;

  int arr[n][2];
  for(int i=0; i<n; i++){
    cin >> arr[i][0] >> arr[i][1];//함수값 받기
  }
  
  minX = arr[0][0]; maxX = arr[0][0]; //일단 값 1개 설정
  minY = arr[0][1]; maxY = arr[0][1];
  for(int i=1; i<n; i++){             // 완전 탐색할 범위 찾기
    if(arr[i][0]>maxX){
      maxX = arr[i][0];
    }
    else if(arr[i][0]<minX){
      minX = arr[i][0];
    }
    if(arr[i][1]>maxY){
      maxY = arr[i][1];
    }
    else if(arr[i][1]<minY){
      minY = arr[i][1];
    }
  }  

  pointX=minX;  pointY=minY;
  long long int size = (maxY-minY+1)*(maxX-minX+1);  //완전 탐색하는 횟수
  long long int xy=0;   // 완전 탐색해서 2차원 배열에 넣기 위한 열의 *번째
  long long int arr_dis[size][n];
  for(int i=minY; i<=maxY; i++){
    for(int j=minX; j<= maxX; j++){
      for(int l=0; l<n; l++){    //각 점에서 최소길이 구해서 한 행에 순차적으로 넣기
        int subY= 0, subX=0;
        subY = i-arr[l][1];
        subX = j-arr[l][0];
        arr_dis[xy][l] = abs(subX) + abs(subY);
      }
      xy+=1;
    }
  }
  //일단 가능한 범위 내에서 모든 경우의 수를 다 구하는 것이기 떄문에 
  //최소 길이는 작은 순으로 정렬 안해도 된다고 판단. 맞는지는 확인 못함
  //답이 되는 어떠한 한 점의 경우가 배열의 한 행에 무조건 있을 것
  
  //arr_dis 출력 이상 없었음
  /*
  for(int i=0; i<xy; i++){
    for(int j=0; j<n; j++){
      cout << arr_dis[i][j] << " ";
    }
    cout << "\n";
  }
  */
  
  
  for(int i=1; i<=n; i++){
    long long int min_distance = 50000001;
    if(i==1){
      cout << 0 << " ";
      continue;
    }
    for(int j=0; j <xy; j++){ // k개 사이의 최소 거리 찾기
      int sum  = 0;
      for(int k=0; k<i; k++){
        sum += arr_dis[j][k];
    
      }
      if(sum<min_distance){
        min_distance = sum;
      }
    }
    
    cout << min_distance << " ";
  }
  
  return 0;
  /*
  for(int i=0; i<xy; i++){
    for(int j=0; j<n; j++){
      cout << arr_dis[i][j] << " ";
    }
    cout << "\n";
  }
  n
xy0 1 3 8
  1 0 2 7
  2 1 1 6
  3 2 0 5
  4 3 1 4
  5 4 2 3
  6 5 3 2
  7 6 4 1
  8 7 5 0
    
  */
  
}

답변 1

0

안녕하세요, 인프런 AI 인턴이에요. integerOverflow가 뜨는 이유에 대해 설명해드릴게요.

integerOverflow는 정수의 범위를 벗어날 때 발생하는 오류입니다. int 자료형은 일반적으로 -2147483648부터 2147483647까지의 값을 표현할 수 있습니다. 이 범위를 벗어나면 integerOverflow가 발생하게 됩니다.

이 코드에서도 long long int를 사용해서 범위를 넓혀주었지만, 여전히 integerOverflow가 발생하는 이유는 아마 계산 과정에서 발생할 수 있는 문제일 것입니다. 예를 들어, 완전 탐색할 범위가 매우 큰 경우, 차이를 계산하는 부분에서 Overflow가 발생할 가능성이 있습니다.

정확한 원인을 파악하기 위해서는 코드의 나머지 부분도 함께 살펴봐야 할 것 같아요. 다른 부분에도 Overflow가 발생할 가능성이 있기 때문이에요. 코드 전체를 확인해보고, 어디에서 Overflow가 발생하는지 찾아보세요. 그리고 해당 부분을 수정하여 Overflow를 방지할 수 있도록 해보세요.

더 자세한 설명이 필요하다면, 해당 부분 코드와 함께 다시 질문해주세요. 도움이 되었길 바랄게요.

yongyong213님의 프로필 이미지
yongyong213
질문자

long long int로 계산해도 범위를 벗어나는 것 같네요 감사합니다

yongyong213님의 프로필 이미지
yongyong213

작성한 질문수

질문하기