코딩 테스트의 통곡의 벽? 프로그래머스 레벨2 간단하게 해결하는 방법 완벽 가이드
프로그래머스 레벨1을 가볍게 통과하고 레벨2에 진입한 많은 학습자가 갑자기 높아진 난이도에 당황하곤 합니다. 레벨2는 단순히 문법을 아는 단계를 넘어, 자료구조의 효율적인 활용과 알고리즘적 사고력을 본격적으로 요구하는 구간이기 때문입니다. 하지만 핵심 패턴을 파악하고 접근법을 정형화하면 레벨2도 충분히 ‘간단하게’ 해결할 수 있습니다. 효율적인 학습 전략부터 빈출 유형 공략법까지 상세히 정리해 드립니다.
목차
- 레벨2 정복을 위한 마인드셋과 준비물
- 문제 해결 시간을 단축하는 3단계 접근법
- 반드시 숙지해야 할 핵심 알고리즘 5가지
- 시간 복잡도를 줄이는 효율적인 자료구조 활용법
- 실수 방지를 위한 디버깅 및 예외 케이스 체크리스트
- 실전 감각을 키우는 반복 훈련 루틴
레벨2 정복을 위한 마인드셋과 준비물
- 레벨1과의 결정적 차이 이해
- 레벨1: 단순 구현, 조건문/반복문 활용 위주
- 레벨2: 자료구조(Stack, Queue, Hash) 선택 및 알고리즘(DFS/BFS, 탐욕법) 적용 필요
- 시간 제한과 효율성 테스트
- 정확성뿐만 아니라 효율성 테스트가 추가되므로 이상의 로직은 지양해야 함
- 입력 데이터의 크기()를 보고 허용되는 시간 복잡도를 미리 예측하는 습관 필요
- 언어별 표준 라이브러리 숙달
- Python:
collections.deque,itertools,heapq등 - Java:
ArrayList,HashMap,PriorityQueue,Stack/Queue등 - C++:
vector,map,set,algorithm헤더 등
문제 해결 시간을 단축하는 3단계 접근법
- 1단계: 지문 해석 및 제약 조건 파악
- 문제를 읽으며 핵심 키워드에 표시하고 출력 형식을 확인
- 입력값의 범위를 통해 시간 복잡도 한계점 설정 (예: 이면 이하로 설계)
- 2단계: 손으로 로직 설계 (Pseudo Code)
- 바로 코드를 작성하지 말고 종이나 메모장에 로직의 흐름을 번호 순서대로 정리
- 사용할 자료구조와 알고리즘을 확정하고 예시 입력을 대입해 검증
- 3단계: 단계별 구현 및 예외 처리
- 가장 기본적인 케이스가 동작하도록 골격 코드 작성
- 이후 효율성을 고려해 코드를 최적화하고 엣지 케이스(빈 배열, 최대/최소값 등) 보완
반드시 숙지해야 할 핵심 알고리즘 5가지
- 해시 (Hash)
- 완주하지 못한 선수, 의상 문제 등 키-값 쌍을 이용해 탐색 속도를 $O(1)$로 단축
- 중복 제거가 필요할 때는 Set을, 카운팅이 필요할 때는 Map(Dictionary)을 활용
- 스택과 큐 (Stack & Queue)
- 올바른 괄호, 주식 가격 등 데이터의 순서가 중요한 문제에 적용
- ‘직전 데이터와의 비교’는 스택, ‘순차적 처리’는 큐를 우선적으로 고려
- 정렬 (Sorting) 및 탐욕법 (Greedy)
- 가장 큰 수, 구명보트 문제 등 현재 상황에서 최선의 선택을 하는 전략
- 대부분의 그리디 문제는 정렬이 선행되어야 함을 명심
- 완전 탐색 (Brute Force) 및 DFS/BFS
- 타겟 넘버, 피로도 문제 등 모든 경우의 수를 따져야 할 때 사용
- 재귀 깊이 제한이나 방문 처리(Visited) 배열 활용에 주의
- 힙 (Heap)
- 더 맵게 문제 등 최솟값이나 최댓값을 지속적으로 추출해야 하는 상황에 적합
- 일반 정렬보다 삽입/삭제가 빠르므로 실시간 우선순위 관리에 필수적
시간 복잡도를 줄이는 효율적인 자료구조 활용법
- 리스트 대신 덱(Deque) 사용
- 배열의 앞부분에서 요소를 삭제하거나 삽입할 때
list.pop(0)은 $O(N)$이 걸리지만,deque.popleft()는 $O(1)$로 처리 가능
- Set을 활용한 멤버십 테스트
- 특정 요소가 포함되어 있는지 확인할 때 리스트()보다 세트()가 훨씬 효율적
- 정렬된 상태 유지하기
- 데이터를 넣을 때마다 정렬하는 대신
PriorityQueue나 이진 탐색 기반의 삽입 라이브러리 활용
- 누적 합 (Prefix Sum)
- 범위의 합을 반복해서 구할 때 미리 합산 배열을 만들어 계산 횟수를 획기적으로 감소
실수 방지를 위한 디버깅 및 예외 케이스 체크리스트
- 인덱스 범위 확인 (Index Out of Range)
- 반복문 제어 변수가 배열의 크기를 벗어나지 않는지, 빈 배열일 때 접근하는 코드가 없는지 확인
- 자료형의 크기
- 결과값이 매우 커질 수 있는 경우 정수형 오버플로우를 방지하기 위해 64비트 정수형(Long) 고려
- 문제의 특수 조건 망각
- “단, 같은 값이 있을 수 있다”, “정렬된 순서로 출력한다” 등 지문의 세부 제약 조건 재확인
- 무한 루프 방지
- While문 사용 시 탈출 조건이 명확한지, 재귀 함수 사용 시 기저 사례(Base Case)가 적절한지 검토
실전 감각을 키우는 반복 훈련 루틴
- 유형별 모아 풀기
- 특정 주간을 정해 ‘DFS/BFS’만 10문제 이상 몰아서 풀며 해당 알고리즘의 템플릿을 몸에 익힘
- 다른 사람의 풀이 분석
- 문제를 맞혔더라도 프로그래머스의 ‘다른 사람의 풀이’ 탭을 통해 더 간결하고 효율적인 코드 학습
- 시간 제한 두고 풀기
- 레벨2 기준 한 문제당 최대 40~60분의 타이머를 맞추고 실전처럼 집중해서 풀이
- 오답 노트 작성
- 막혔던 부분, 새로 알게 된 라이브러리 함수, 실수한 로직 등을 짧게 기록하여 같은 실수 반복 방지