하루 종일 깃허브 블로그 만들기에 시간을 쏟기 전
입대 전에 구름 EDU란 곳에서 결제해 둔 알고리즘 학습 강좌를 잠시 했었습니다.
강좌 중 코딩 문제 하나를 풀었는데 다음과 같았습니다.
반복문과 조건문을 이용하여 배열 내 원소들 중 최대 정수 값을 반환하는 코드를 작성하면 되는 간단한 문제입니다.
게다가 기본 틀도 제공해 줘서 저는 배열 내 최댓값 반환 함수만 구현하면 되는 상태였습니다.
#include<stdio.h>
#include<iostream>
using namespace std;
int getMax(int* data, int n)
{
// 여기만 구현하면 됨.
int answer = data[0];
for (int i = 0; i < n-1; i++)
{
if (data[i+1] > answer)
answer = data[i+1];
}
return answer;
}
int main()
{
// 이미 구현되었던 부분
int n;
int *data;
scanf("%d", &n);
data = new int[n];
for (int i = 0; i < n; i++)
{
scanf("%d", &data[i]);
}
int answer = getMax(data, n);
printf("%d\n", answer);
delete[] data;
return 0;
}
출력 결과도 다 정답이라 다음으로 넘어가도 되었지만
여기서 저는 공부를 위해 처음부터 코드를 다시 작성하기로 했습니다.
그리고 scanf가 아닌 cin, cout 입출력 개체를 이용하기로 했습니다.
문제는 여기서부터 발생했습니다.
#include<stdio.h>
#include<iostream>
using namespace std;
/**
* 배열의 최대값을 계산하는 함수.
*
* @param data
* @param n
* @return data[0] ~ data[n-1]중 최대값.
*/
int getMax(int* data, int n)
{
int answer = data[0];
for (int i = 0; i < n-1; i++)
{
if (data[i+1] > answer)
answer = data[i+1];
}
}
int main()
{
int n;
int *data;
cin >> n;
data = new int[n];
for (int i = 0; i < n; i++)
{
cin >> data[i];
//임시 디버깅용
cout << "n = " << n <<" , " << "i = " << i << " = " << data[i] << endl;
}
int answer = getMax(data, n);
printf("%d\n", answer);
delete[] data;
return 0;
}
다시 작성한 코드로 테스트 케이스를 돌리니 시간 초과로 답이 나오질 않는 겁니다.
이미 위의 코드를 보시면서 눈치 채셨을 수도 있겠지만
저는 다시 코드를 작성하는 과정에서 한 줄을 빼먹었습니다.
바로 getMax함수의 반환값을 작성하지 않은 것입니다.
그런데 컴파일 오류없이 코딩이 돌아갔고, 계속 오류가 뜬겁니다.
그것도 모르고 저는 30분동안 for문 안쪽만 주구장창 디버깅하고 있었습니다.
for (int i = 0; i < n-1; i++)
{
if (data[i+1] > answer)
answer = data[i+1];
}
여기 for문만 보면은 조건식이 i < n-1인데
위 사진의 디버깅 결과는
i가 n-1보다 같거나 커져도 for문이 멈추지 않고 계속 돌아가는 매직이 펼쳐지고 있습니다.
아직까지도 왜 이렇게 되는지 정확한 이유는 못 밝혀냈으나
빼먹은 getMax함수의 반환값을 작성하니 정상적으로 코드가 작동하는 것을 확인했습니다.
코딩을 하면은 쉬운 문제든 어려운 문제든 상관없이
이렇게 보이지 않는 문제로 에러가 발생하여 전전긍긍하는 상황이 자주 일어나는데,
이럴 수록 천천히 디버깅 하고, 잘못된 부분을 꼼꼼히 살펴야 함을 다시 한 번 배울 수 있는 시간이었습니다.
무엇보다 다음 번에 코딩할 땐 이런 실수를 반복하지 않도록 이렇게 기록으로 남겨둡니다.
Note 1) 반환값이 있는 함수는 return 문장을 혹시 빼 먹지는 않았는지 다시 한 번 확인하자.
Note 2) 오류에 봉착했을 땐, 생각지도 못한 곳에 문제의 원인이 있을 수도 있으니 한 부분에만 매달리지 말자.
'◼ IT Etc. > (Until 2021)' 카테고리의 다른 글
오늘의 공부 후기 (알고리즘, 유니티) (0) | 2021.03.14 |
---|---|
[알고리즘] 선택 정렬(Selection Sort) 알고리즘 쉽게 구현해보기 (C++) (0) | 2021.03.12 |
점점 재밌어지는 알고리즘 공부(선택정렬 구현!) 반대로 위기의 유니티 공부.. (0) | 2021.03.12 |
하루를 걸쳐 깃허브 블로그를 만들어 봤는데... (0) | 2021.03.10 |
기말 고사를 준비하는 컴공과 새내기 대학생의 삶 (0) | 2018.12.07 |