일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- 다중 catch 블록
- 예외클래스
- throws 키워드
- 예외 처리
- try-catch-finally 블록
- 실행 예외
- 로켓펀치 #취준컴퍼니 #취업 #일상 #취준생
- 예외
- 개발자취업
- 코딩테스트준비
- 일반 예외
- til
- 99클럽
- 항해99
- Today
- Total
innn
디버깅 활용 사례 살펴보기 본문
코테를 진행하며 실수하기 쉬운 4가지 오류 찾아보기
구간 합 관련 코드이다. 언뜻 보면 문제가 없는 것 같지만 이 코드에는 실수하기 쉬운 4가지 오류가 숨어져 있다.
실제 코테에 입력할 코드와 비교하면 짧고 단순한 코드이다. 눈으로 오류를 금방 찾았을 수도 있다.
하지만 코테는 이보다 복잡한 알고리즘 로직이 필요하며, 코드의 길이도 길어서 논리 오류를 눈으로 찾기 어렵다.
디버깅으로 논리 오류를 찾아보자.
오류 1. 변수 초기화 오류 찾아보기
1번째 오류는 변수 초기화 로직에서 초기화를 제대로 하지 않은 경우이다. 다음 화면에서 변숫값 기능을 보여주는 Variables 탭을 보자.
Variables 탭의 t가 2이므로 2번째 테스트 케이스를 진행하는 중이라는 것을 알 수 있다. 그리고 중단점은 20번째 줄을 가리키고 있으므로 이제 막 2번째 테스트 케이스를 실행하기 시작한 시점이다. 그런데 answer의 값은 0이 아닌 1327708815이다. 이는 초기화 로직에 문제가 있다는 것을 의미한다. 1번째 케이스에서 도출한 answer의 값이 그대로 남아있는 것.
변수 초기화 로직은 놓치기 쉽다. 코드가 복잡해지면 더욱 그렇다. 실제 코테의 2번째 테스트 케이스부터 통과되지 않는다면 모든 변수가 정상적으로 초기화되고 있는지 디버깅을 이용해 확인해 보는 것도 해결에 도움이 된다.
오류 2. 반복문에서 인덱스 범위를 잘못 지정한 경우
종종 반복문에서 반복 범위를 잘못 지정하거나 비교 연산자를 반대로 사용하는 경우가 있다. 위 경우 Variables 탭에서 볼 수 있듯이 S[10000]부터의 값이 모두 0이다. 반복문에서 배열 S에 값이 제대로 저장되지 않았기 때문. 13~17번 라인을 보면 초기에 합 배열을 구하는 과정에서 반복문의 범위가 10000이다. 배열 A와 S의 크기가 100001이므로 반복 범위는 100000이어야 한다. 0을 하나 누락한 것이다.
이런 경우 외에도 배열 인덱스가 0부터 시작한다는 사실을 간과하는 경우도 있고, 반복문을 N까지 반복하도록 설정해야 하는데 비교 연산자를 잘못 입력하여 N - 1까지 반복하도록 설정하는 경우도 있다. 인덱스 범위 지정 오류는 여러 형태로 발생할 수 있으니 반복문을 사용할 때마다 범위와 시작 인덱스를 꼼꼼하게 확인하고, 혹시 모를 오입력을 대비해 디버깅하는 습관 들이자.
오류 3. 잘못된 변수 사용 오류 찾아보기
출력 부분이나 로직 안에서 사용해야 하는 변수를 다른 변수와 혼동하여 잘못 사용하는 경우도 있다. 예를 들어 반복문에서 반복 변수를 사용해야 하는데 기준 변수를 사용하거나 변수 이름 자체가 비슷해서 잘못 사용하는 경우이다.
t는 1이므로 1번째 케이스다. 그리고 디버깅은 26번째 줄을 가리키고 있다. 원래 문제에서 요구한 테스트 케이스의 출력 결과는 '몇 번째 테스트 케이스의 답이 무엇이다'이므로 1 999999와 같이 출력되어야 한다. 그런데 Console 탭을 보면 5-1875592971을 출력하고 있다. 분명 1번째 테스크 케이스를 실행하는 중이므로 1이 출력되어야 하는데 그렇지 않다. 이는 26번째 줄에서 출력 변수를 t가 아니라 testcase로 지정했기 때문이다. 코딩을 하는 도중에 t와 testcase를 혼동했을 가능성이 높다.
> Variables 탭의 answer 값이 Console 탭의 answer의 값과 다른 이유는? Console 탭의 answer 값 -1875592971의 경우 i가 0인 경우 출력한 값이고, Variables 탭의 answer값 1862370832는 이후 i가 1이 되며 새로 계산된 값이다.
오류 4. 자료형 범위 오류 찾아보기
Variables 탭에서 배열 S를 보면 음수로 된 값들이 보인다. 이 문제에서 S에 음수를 허용하지 않으므로 이상한 값이 저장된 것임은 분명하다. 왜 그럴까? 그 이유는 배열을 int형으로 선언했기 때문이다. 계산 과정에서 int형이 저장할 수 없는 범위의 값이 나온 것이다. 배열을 선언할 때 int형이 아니라 long형으로 선언했다면 이런 오류는 발생하지 않았을 것이다.
> int형은 -2147483648 ~ 2147483647 범위를, long형은 -922337203685475808 ~ 9223372036854775807 범위를 저장할 수 있다.
디버깅을 이용하면 자신이 작성한 로직에 존재하는 논리 오류를 좀 더 효율적으로 발견할 수 있다. 실제 코테에서는 시간이 촉박하므로 디버깅에 익숙해지는 것이 좋다.
자료형은 처음부터 long형으로 선언하자!
앞서 소개한 4가지 실수 중 가장 하기 쉬운 실수는 자료형 범위 오류이다. 이러한 오류를 예방하는 방법은 변수를 처음부터 long형으로 선언하는 것이다. 대부분의 코테에서 계산되는 값들은 long형 안에서 표현할 수 있으니 변수를 선언할 때는 처음부터 long형으로 선언하자.
'코딩 테스트 > 코테 문제 풀이' 카테고리의 다른 글
배열과 리스트 (문제 002) (ArithmeticException 에러 뜻) (0) | 2022.09.25 |
---|---|
배열과 리스트 (문제 001) (0) | 2022.09.24 |
디버깅은 왜 중요할까 (0) | 2022.09.21 |
시간 복잡도 활용하기 (0) | 2022.09.21 |
시간 복잡도의 개념 (0) | 2022.09.21 |