본문 바로가기
Thinking

코딩테스트 문제 분석 방법

by Dev_카페인 2024. 5. 23.
반응형

코딩테스트 문제 분석 방법

 

코딩 테스트 문제를 효율적으로 분석하고 파악하기 위한 몇 가지 방법과 전략을 소개합니다. 

1. 문제 이해하기

  • 문제의 목적 파악: 문제에서 요구하는 최종 결과가 무엇인지 명확히 합니다.
  • 입력과 출력 확인: 주어지는 입력의 형태와 조건, 그리고 출력의 형태와 조건을 이해합니다.
  • 제약 조건 확인: 입력의 크기, 시간 제한, 메모리 제한 등을 확인하여 사용할 알고리즘의 효율성을 미리 판단합니다.

2. 예제 분석

  • 제공된 예제 검토: 문제에서 제공하는 예제 입력과 출력을 통해 문제를 이해합니다.
  • 추가 예제 만들기: 예제만으로 이해가 부족하다면 직접 몇 가지 입력을 만들어보고 예상되는 출력을 도출해 봅니다.

3. 주요 요구사항 파악

  • 핵심 기능 식별: 문제를 해결하기 위해 꼭 필요한 기능이나 알고리즘이 무엇인지 파악합니다.
  • 관련 알고리즘 찾기: 문제의 유형에 따라 적용 가능한 알고리즘을 떠올립니다 (예: 정렬, 탐색, 다이나믹 프로그래밍 등).

4. 계획 세우기

  • 단계별 접근: 문제를 작은 단계로 나누어 각 단계별로 어떤 작업을 수행할지 계획합니다.
  • 가짜 코드 작성: 실제 코딩에 앞서 가짜 코드를 작성하여 전체적인 흐름을 미리 확인합니다.

5. 구현하기

  • 기본 구조 구현: 우선 전체적인 코드의 기본 틀을 작성합니다.
  • 세부 구현: 단계별 계획에 따라 세부 기능을 구현합니다.
  • 테스트: 작성한 코드가 예제 입력에 대해 올바른 출력을 내는지 확인합니다.

6. 디버깅 및 최적화

  • 디버깅: 문제가 발생한 경우, 디버깅을 통해 원인을 찾고 수정합니다.
  • 최적화: 코드의 시간 복잡도와 공간 복잡도를 고려하여 최적화가 필요한 부분을 개선합니다.

예제 문제 분석

문제 예제

Given an array of integers, return the indices of the two numbers that add up to a specific target.

Example:
Input: nums = [2, 7, 11, 15], target = 9
Output: [0, 1]
Explanation: Because nums[0] + nums[1] == 9, we return [0, 1].

 

 

분석 과정

  1. 문제 이해: 배열에서 두 수를 찾아 더했을 때 특정 값이 되는 두 수의 인덱스를 찾는 문제.
  2. 입력과 출력 확인:
    • 입력: 정수 배열과 목표 값 (target)
    • 출력: 두 수의 인덱스 배열
  3. 제약 조건 확인: 배열 내 같은 요소를 두 번 사용할 수 없음. 중복된 해가 없음을 가정.
  4. 예제 분석:
    • nums = [2, 7, 11, 15], target = 9
    • 2 + 7 = 9 이므로 출력은 [0, 1]
  5. 주요 요구사항 파악:
    • 배열 탐색
    • 두 수의 합이 target인지 확인
  6. 계획 세우기:
    • 배열을 한 번 순회하면서 나머지 값을 해시맵에 저장
    • 현재 수와 더했을 때 target이 되는 수가 해시맵에 있는지 확인
  7. 구현하기:
def two_sum(nums, target):
    num_map = {}
    for i, num in enumerate(nums):
        complement = target - num
        if complement in num_map:
            return [num_map[complement], i]
        num_map[num] = i

 

8. 디버깅 및 최적화: 위 코드가 예제 입력에 대해 올바른 출력을 내는지 확인 후, 필요시 추가적인 최적화를 고려.

 

이와 같은 방식으로 코딩 테스트 문제를 체계적으로 분석하고 해결할 수 있습니다.

 

위 방식은 통용되는 문제 파악 방식이다.

 

코딩 테스트는 코딩 능력이 아니라 문제 풀이 능력을 확인하는 것이 핵심이다. 그래서 무작정 코드를 작성하기보다는 문제 분석에도 시간을 충분히 사용해야 합니다.

대부분 2시간에서 4시간 정도 문제 풀 시간을 주므로 전체 시간의 50~60% 정도는 문제 분석에 시간을 쓰는 것이 좋습니다.

 

문제를 분석하는 방법

1. 문제를 쪼개서 분석하라

  문제 분석 단계에서는 문제 전체를 한 번에 분석하는 것보다 문제를 동작 단위로 쪼개서 분석하는 것이 유리합니다. 한 번에 생각해야 하는 양을 줄이면 문제에 좀 더 유연하게 접근할 수 있습니다.

 

2. 제약 사항을 파악하고 테스트 케이스를 추가하라

  문제에는 보통 제약 사항이 있습니다. 제약 사항을 정리해두고 이를 고려해서 테스트 케이스를 추가하는 연습을 하는 것이 좋습니다. 이 과정은 어떤 알고리즘을 사용할지 고민할 때 유용하고 추후 코드를 구현하는 단계에서 예외를 거를 때 도움이 됩니다.

 

3. 입력 크기를 분석하라

  보통 알고리즘의 시간 복잡도는 입력 크기가 결정하는 경우가 많습니다. 입력 크기를 확인하면 문제를 제한 시간 내에 풀 수 있는 알고리즘과 그렇지 않은 알고리즘을 미리 걸러낼 수 있죠. 예를 들어 입력 크기가 100만 개라면 O(N^2) 알고리즘으로는 맞는 코드를 작성해도 시간 내에 출력값이 나오지 않으므로 테스트를 통과할 수 없습니다. 그러니 구현 전에는 반드시 입력 크기를 분석하기 바랍니다.

 

4. 핵심 키워드를 파악하라

  코딩 테스트 공부를 많이 한 사람들은 문제를 빨리 해석합니다. 문제를 빨리 해석할 수 있는 이유는 문제의 핵심 키워드를 빨리 파악하기 때문입니다. 물론 '문제의 핵심 키워드가 A이면 무조건 알고리즘을 적용하라'는 것은 아닙니다. 하지만 핵심 키워드는 곧 특정 알고리즘을 암시하는 경우가 많고, 핵심 키워드를 파악하면 좀 더 빠르게 문제를 파악하고 좋은 알고리즘을 선택해 코드를 작성할 수 있으므로 이 연습도 해두면 좋습니다.

 

예시

스택 - 쌍이 맞는지
- 최근
- 무언가를 저장하고 반대로 처리해야 할 때
- 데이터의 조합이 균형을 이뤄야할 때
- 알고리즘이 재귀 특성을 가질 때
- 최근 상태 추적
- 순서대로
- 스케줄링
- ~대로 동작하는 
- 최소 시간
- 특정 조건에 따라 시뮬레이션 할 때
- 시작 지점부터 목표 지점까지 최단 거리
깊이 우선 탐색 - 모든 경로 - 메모리 사용량이 제한적일 때의 탐색
- 백트래킹 문제를 풀 때
너비 우선 탐색 - 최적
- 레벨 순회
- 최소 단계
- 네트워크
- 시작 지점부터 최단 경로나 최소 횟수를 찾아야할 때
백트래킹 - 조합
- 순열
- 부분 집합
- 조합 및 순열 문제
- 특정 조건을 만족하는 부분 집합
최단 경로 - 최단 경로
- 최소 시간
- 최소 비용
- 트래픽
- 음의 순환
- 단일 출발점 경로
- 다익스트라 : 특정 지점에서 나머지 지점까지 가는 최단 경로
- 벨만-포드 : 음의 순환 탐지, 음의 가중치를 가진 그래프에서 최단 경로

 

5. 데이터 흐름이나 구성을 파악하라

  문제 풀이에 사용할 자료구조와 알고리즘을 선택하고 구현 방향을 정할 때 중요한 고려 대상입니다. 만약 데이터의 삽입과 삭제가 빈번하게 일어날 것 같다면 힙(Heap) 자료구조를 고려하는 것이 좋습니다. 최적화된 해결책을 떠오르지 않는다면 전체 탐색 방식으로 모든 경우를 확인하는 방법도 좋고, 특별한 자료구조나 알고리즘을 사용하는 대신 하드 코딩 방식으로 풀이하는 것도 하나의 전략입니다. 결국 코딩테스트는 제한 시간 내에 결괏값이 나오면 패스입니다.

 

반응형