코딩테스트와 PS를 연습하며 자주 당했고, 본 실수들을 적어봅니다.

여기 적힌 내용들은 정말 '실수'라서 올바른 솔루션을 작성하고서도 틀리는 안타까운 경우들입니다. 제출 전에 잘 체크하여 쓸데없는 시간낭비나 불합격을 줄이도록 합시다.

 

 

1. 쓸데없는 출력문 지우기

디버깅을 하거나 작성한 코드가 제대로 돌아가는지 확인하기 위해서 코드 중간 중간에 print문을 넣어놓는 경우가 있습니다. 

 

출력으로 결과를 제출하는 백준의 경우엔 해당 print문을 주석처리하지 않으면 99% 확률로 오답처리되고, 프로그래머스나 Leetcode처럼 데이터를 return하는 경우에도 print로 인한 시간초과가 발생하기 쉽습니다. 실제 기업 채용 코딩테스트에서도 비슷하게 작동하겠죠?

 

문제를 잘 풀어놓고 틀리지 않으려면 제출 전에 주석처리나 지우는 작업을 했는지 반드시 체크해야합니다.

 

 

2. 정답 갱신 체크하기

호출한 재귀 함수나 반복문 내부에서 정답을 잘 구해놓고 return 하는 answer값을 변경하지 않아 틀리는 경우가 종종 있습니다. 또는 최솟값, 최댓값을 요구하는 문제에서 min이나 max함수를 제대로 사용하지 않아 틀리는 경우가 많습니다.

 

특히 예시에서 보여주는 입력이 해당 오류를 체크할 수 없는 경우에 잘 풀어놓고 정말 허망하게 문제를 틀리는 경우가 많습니다. 채점 결과를 공개하지 않는 테스트가 늘어나는 흐름에서 응시자가 놓치면 안되는 포인트입니다.

 

 

예를들어, 양의 정수가 담겨있는 배열에서 가장 큰 정수가 위치한 인덱스를 return하는 쉬운 문제에서 솔루션 코드를 이렇게 짰다고 해봅시다.

def solution(arr):
   answer = 0
   n = -1
    
   for i in range(len(arr)):
      if arr[i] > n:
      	 answer = i
   	
    return answer

 

예시 케이스로 [1, 2, 3, 4, 5]가 주어진다면 가장 큰 정수인 5가 위치한 인덱스 4를 return합니다.

하지만 이 솔루션은 틀린 솔루션입니다. 입력으로 [2, 3, 4, 5, 1]이 들어와도 정답인 3 대신 4를 return합니다.

i 번째 수가 더 큰지를 판단하고 나서 값을 갱신해주지 않았기 때문에 조건문이 항상 -1보다 더 큰지를 비교하고 맨 뒤 인덱스를 return하기 때문입니다. 

.

 

또는 가장 큰 수가 몇개 있는지를 출력하는 문제를 생각해 봅시다.

def solution(arr):
   answer = 0
   maxnum = -1
    
   for n in arr:
      if n >= maxnum:
         answer = 1
         maxnum = n
      elif n == maxnum:
         answer += 1
   	
   return answer

예시 케이스로 [1, 2, 3, 4, 5]가 주어진다면 정답인 1을 return하지만 이 솔루션도 틀린 솔루션입니다. [1, 2, 3, 4, 5, 5, 5]가 들어와도 정답인 3 대신 1을 return합니다.

가장 큰 수가 갱신되는 n > maxnum이 아닌 n >= maxnum을 넣었기 때문에 큰 수가 몇개인지 카운트를 키우지 않고 계속 1로 초기화 하기 때문입니다.

 

이런 간단한 실수를 발견하지 못한다면 기껏 문제를 잘 풀어놓고 억울하게 틀릴 수 있습니다.

 

 

위 실수들을 잘 체크해서 코딩테스트 통과하시고 취업의 꿈! 꼭 이루시길 바랍니다. 

 

728x90

저는 코딩 테스트를 그럭저럭 잘 푸는 편입니다.

어... 자뻑이 아니라, 객관적으로 그럴 겁니다!! 아마!

올해 치른 코테에서 대부분 합격했으니까요.

 

1차를 기껏 통과해놓고 2차 코딩 테스트나 면접에서 잘렸습니다만...

 

 

아무튼, 여태까지는 그냥 코테 문제를 보고 생각 없이 열심히 풀면 풀렸습니다.

하지만 실력면에서나 프로그래머로서의 커리어에 있어서나 좋지 않은 습관이 생기고 있는 것 같아
문제풀이 루틴을 정리하고 습관화해보려고 합니다.

코딩 테스트는 작게는 취직을 위한 테스트일 뿐이지만 문제풀이 루틴은 앞으로의 어떤 문제에도 적용 가능하니까요.

 

 

45분에 하나의 문제를 푼다고 가정해 보겠습니다.

보통 코딩 테스트가 4~7문제를 2~4시간 동안 풀고

앞의 몇 개의 문제는 비교적 쉽기 때문에 시간을 절약할 수 있으니

이 시간에 페이스를 맞추어 풀면 1,2개의 킬러 문제를 제외하면 대부분 풀 수 있는 시간입니다.

그리고 제 경험에 의하면 킬러 문제의 풀이는 합격에 크게 영향을 끼치지 않습니다.

(코딩 테스트가 4문제로 이루어진 경우 합격 라인은 2.5~3문제, 7문제의 경우 4.5~6문제 정도였습니다.)

 

1. 이해 (5분)

문제에 대한 이해를 진행합니다. 

 

2. 계획 (5분)

문제의 내용을 토대로 어떤 알고리즘을 써서 풀이하거나 구현할지 생각합니다.

- 간단한구현/복잡한구현(시뮬레이션)/DFS/BFS/DP/브루트포스/그리디/기타 알고리즘 (다익스트라,MST 등등) 

 

3. 검증 (5분)

내가 떠올린 알고리즘이나 풀이가 문제를 풀 수 있는지를 생각해 봅니다.

- 내가 구상한 방법을 사용하면 실행시간 안에 답을 구할 수 있을지 생각합니다.

 

풀이에 적합한 자료구조를 떠올립니다.

- Array/ArrayList/LinkedList/Queue/PriorityQueue/Stack/Map/Set

 

시간이나 메모리를 줄일 방법이나 풀이를 좀 더 수월하게 할 수 있는 기법이 있는지 확인합니다.

- 정렬/비트마스킹/가지치기/메모이제이션/투포인터/슬라이딩윈도우/기타 등등

 

또 문제의 입력, 조건, 범위 등을 체크합니다.

- 테스트 케이스의 갯수 -> 테스트케이스의 형태 -> 입력의 범위 -> 출력의 범위 -> 자료구조의 크기

 

4. 풀이 (30분)

그리고 대망의 풀이!입니다.

가능하면 여유 부리지 않고 빠르게 풀이하는 게 좋습니다.

풀이가 틀릴 수도 있고, 디버깅 등을 통해 예외를 체크할 시간이 필요하기 때문입니다.

음... 여기는 딱히 드릴 팁이 없습니다.

풀이 시간이 부족하시다면 더 많은 노력과 연습!! 을 하셔야 합니다. 

코딩은 운동처럼 머슬 메모리로 하는 겁니다.

 

5. 채점, 디버깅 (+@)

코딩 테스트에서 주어진 예제를 모두 맞추더라도 내부 채점에선 틀리는 경우가 생깁니다.

제가 겪은 자주 발생하는 예외는 다음과 같았습니다.

 

- 입력이 0개, 혹은 1개인 경우

- 특정 상황에서 답이 없는 경우 (정답 변수의 초기화를 체크)

- 정답의 형식이 맞지 않는 경우 (대소문자, 개행 문자, 띄어쓰기 예외적인 경우 등 체크)

 

- 변수의 표현 범위를 넘어서는 경우, 시간 초과 (앞에서 체크했지만 혹시 모르니!)

 

 

다음 알고리즘 풀이부턴 이 5단계에 따라 걸린 시간을 체크하면서 작성해보도록 하겠습니다.

감사합니다!

728x90

+ Recent posts