코딩 테스트 통과율을 높이는 프로그래머스 lv2 간단하게 해결하는 방법
많은 개발 지망생들이 기초적인 lv1 문제를 넘어서 lv2에 진입하면서 첫 번째 벽을 느낍니다. 하지만 접근 방식만 바꾸면 복잡해 보이는 문제도 훨씬 명확해집니다. 효율적인 로직 설계와 내장 라이브러리 활용을 통해 문제를 해결하는 핵심 비전략을 정리해 드립니다.
목차
- lv2 문제 해결을 위한 사고방식의 전환
- 시간 복잡도와 효율성을 고려한 자료구조 선택
- 필수 알고리즘 패턴 익히기
- 파이썬 내장 라이브러리 200% 활용하기
- 코드의 가독성과 간결함을 높이는 리팩토링 기법
- 실전 테스트에서 흔히 저지르는 실수와 방지책
lv2 문제 해결을 위한 사고방식의 전환
lv1이 단순 구현과 문법 숙련도를 확인한다면, lv2는 효율적인 알고리즘 선택을 요구합니다.
- 완전 탐색에서 효율적 탐색으로: 무작정 모든 경우의 수를 구하기보다 조건에 맞는 탐색 범위를 좁히는 연습이 필요합니다.
- 제한 사항 확인: 입력값의 크기를 먼저 확인하고, 또는 $O(N \log N)$으로 해결해야 할지 판단해야 합니다.
- 작은 문제로 나누기: 복잡한 조건은 함수로 분리하거나 논리적 단계로 나누어 생각합니다.
시간 복잡도와 효율성을 고려한 자료구조 선택
문제 유형에 맞는 자료구조를 선택하는 것만으로도 코드의 길이가 절반으로 줄어듭니다.
- Stack/Queue:
- 데이터의 삽입과 삭제가 빈번한 경우에 사용합니다.
- ‘올바른 괄호’나 ‘프로세스’ 같은 선입선출/후입선출 문제의 핵심입니다.
- Hash (Dictionary/Set):
- 특정 값을 빠르게 찾아야 할 때(조회 성능 ) 사용합니다.
- 중복 제거가 필요할 때는 Set을, 키-값 쌍이 필요할 때는 Dictionary를 활용합니다.
- Heap (Priority Queue):
- 최댓값이나 최솟값을 지속적으로 추출해야 하는 ‘더 맵게’와 같은 문제에서 필수적입니다.
- 일반적인 정렬()보다 효율적으로 우선순위를 관리할 수 있습니다.
필수 알고리즘 패턴 익히기
lv2에서 가장 자주 출제되는 3가지 패턴을 반드시 숙지해야 합니다.
- DFS/BFS (깊이/너비 우선 탐색):
- 타겟 넘버, 게임 맵 최단거리 등 그래프나 격자 탐색 문제에 사용됩니다.
- 최단 거리는 BFS, 모든 경우의 수를 탐색할 때는 DFS가 유리합니다.
- Greedy (탐욕법):
- 현재 시점에서 가장 최선의 선택을 하는 방식입니다.
- 체육복, 구명보트 문제처럼 정렬 후 순차적으로 접근할 때 유용합니다.
- 이진 탐색 (Binary Search):
- 탐색 범위가 비정상적으로 클 때(예: 1억 이상) 범위를 절반씩 줄여가며 답을 찾습니다.
파이썬 내장 라이브러리 200% 활용하기
프로그래머스 환경에서는 표준 라이브러리를 적극적으로 사용하는 것이 시간을 단축하는 비결입니다.
- collections.deque:
- 리스트의
pop(0)은 $O(N)$이지만, deque의popleft()는 $O(1)$입니다. - 큐 문제를 풀 때 반드시 사용해야 하는 라이브러리입니다.
- itertools (permutations/combinations):
- 순열과 조합을 직접 구현하지 않고 한 줄로 생성할 수 있습니다.
- 소수 찾기나 숫자 만들기 문제에서 강력한 힘을 발휘합니다.
- collections.Counter:
- 요소의 개수를 세어 딕셔너리 형태로 반환합니다.
- 의상 문제나 문자열 빈도 계산 시 코드를 획기적으로 줄여줍니다.
- math:
gcd(최대공약수),ceil(올림),sqrt(제곱근) 등 수학적 계산이 필요할 때 사용합니다.
코드의 가독성과 간결함을 높이는 리팩토링 기법
단순히 맞히는 것을 넘어, ‘프로그래머스 lv2 간단하게 해결하는 방법’의 핵심은 간결한 코드입니다.
- List Comprehension:
[i for i in range(10) if i % 2 == 0]와 같이 한 줄로 리스트를 생성하여 가독성을 높입니다.
- Zip / Enumerate:
- 두 리스트를 동시에 순회하거나 인덱스가 동시에 필요할 때 활용합니다.
- 익명 함수 (Lambda):
sort(key=lambda x: x[1])처럼 간단한 정렬 기준을 정의할 때 유용합니다.
- Any / All:
- 조건들 중 하나라도 참인지, 혹은 모두 참인지 검사할 때 반복문 대신 사용합니다.
실전 테스트에서 흔히 저지르는 실수와 방지책
실력을 갖추고도 감점되는 요인들을 미리 관리해야 합니다.
- 자료형 변환 주의:
- 정수 나눗셈 후 실수가 발생하는 경우
//연산자를 사용하여 정수 몫을 취해야 합니다.
- 복사 문제 (Deep Copy):
- 리스트를 복사할 때
b = a라고 하면 주소값이 복사되어 원본이 변할 수 있습니다.b = a[:]혹은copy.deepcopy()를 고려하세요.
- 문자열 수정 불가능성:
- 파이썬 문자열은 불변 객체이므로, 잦은 수정이 필요하면 리스트로 변환하여 작업한 뒤
join()으로 합치는 것이 효율적입니다.
- 엣지 케이스 확인:
- 빈 배열, 원소가 하나인 경우, 모든 원소가 동일한 경우 등 극단적인 상황을 테스트 케이스로 추가해 봅니다.
문제 풀이 습관화 전략
꾸준함이 실력을 만듭니다.
- 매일 1문제 풀기: 감을 잃지 않는 것이 가장 중요합니다.
- 다른 사람의 풀이 분석: 문제를 푼 직후 다른 사람들의 ‘좋아요’가 많은 풀이를 보며 내 코드와 비교합니다.
- 시간 제한 설정: 실제 시험처럼 30분~1시간의 타이머를 맞추고 집중해서 푸는 연습을 합니다.
- 노트 정리: 막혔던 로직이나 몰랐던 라이브러리는 별도로 정리하여 시험 직전에 복습합니다.