• 카테고리

    질문 & 답변
  • 세부 분야

    알고리즘 · 자료구조

  • 해결 여부

    미해결

오버플로우 관련 질문이 있습니다

21.02.05 17:14 작성 조회수 110

0

안녕하세요 선생님.

수업을 듣고있는 김용준 이라고 합니다.

채점결과로는 5가지 case 전부 success가 나왔지만, 

Q.제가 짠 코드에서 오버플로우를 고려해야 하는지를 여쭤보고 싶습니다. 

-------------------------------------------------------

int isJollyJumper(int*arr, int N);

int main(void)

{

int *arr1, *arr2;

int N;

int i;

scanf("%d",&N);

arr1 = (int*)calloc(N,sizeof(int));

arr2 = (int*)calloc(N-1,sizeof(int));

  // 1. 사용자로 부터 수열을 입력받는다 

       for(i=0; i<N; i++)

{

scanf("%d",&arr1[i]);  

        }

    

//2. 입력받은 수열에서 인접한 값의 차를 구한다 

// 이때, 큰수에서 작은수를 빼서 차를 구하도록 함

    for(i=1; i<N; i++)

    {

     if(arr1[i] > arr1[i-1])

     arr2[i-1] = arr1[i] - arr1[i-1];

    

     else

     arr2[i-1] = arr1[i-1] - arr1[i];

}

// 3. 위에서 구한 차 값을 기반으로, 입력한 수열이

// jolly jumper인지 여부를 구하여, 화면에 결과 출력

if(isJollyJumper(arr2,N) == 1)

printf("YES\n");

else

printf("NO\n");

free(arr1);

free(arr2);

return 0;

    

}

int isJollyJumper(int*arr, int N)

{

int i;

int *isJolly;

isJolly = (int*)calloc(N,sizeof(int));

       

// N개의 수열을 입력받은 경우, 크기가 N인 배열을 생성해

// 0번 element를 사용하지 않고, 1~N-1번 element를

// 사용 하여 jolly jumper 여부를 판별

// 차이가 1에서 N-1 사이에 존재하면, isJolly 배열의 해당 

 // 인덱스를 1증가

       for(i=0; i<N-1; i++)

{

if(arr[i] >= 1 && arr[i] <= N-1)

isJolly[arr[i]]++;

}

for(i=1; i<N; i++)

{

if(isJolly[i] != 1)

return 0;

}

return 1;

}

------------------------------------------------------

저는 위와같이 코드를 작성하였습니다.

이때 저는 큰수에서 작은수를 빼서 차를 구하는 방식으로 작성하였으므로, 이러한  방식으로 차이를 구할 때 오버플로우가 나게 되면 그 결과는 -2147483648 ~ -1 이 됩니다.

그런데 어차피 N의 값의 범위가 3~100 이므로 

오버플로우가 났을 때 적어도 1에서 99사이의 수가 나온다면 jolly jumper가 아닌 수열인데 jolly jumper로 잘못 해석할 수 있겠지만,  큰수에서 작은수를 빼는 방식으로는 오버플로우가 나더라도 1에서 99사이의 수가 나올 수 없으므로,

제가 짠 코드대로 하면은 오버플로우가  나더라도 결과가 정상적으로 구해진다고 생각하였습니다.

Q.제가 맞게 생각한건지 궁금합니다. 

답변 1

답변을 작성해보세요.

0

안녕하세요^^

1부터 N-1로 범위를 지정해주었으니 인덱스 에러는 방지되는 코드입니다.

제가 문제를 명확하게 수정해야 할 것 같네요. 인접한 두 수 차가 정수형 범위에 있다고 수정해 놓겠습니다.