코딩 테스트 통과율을 높이는 프로그래머스 lv2 간단하게 해결하는 방법

코딩 테스트 통과율을 높이는 프로그래머스 lv2 간단하게 해결하는 방법

많은 개발 지망생들이 기초적인 lv1 문제를 넘어서 lv2에 진입하면서 첫 번째 벽을 느낍니다. 하지만 접근 방식만 바꾸면 복잡해 보이는 문제도 훨씬 명확해집니다. 효율적인 로직 설계와 내장 라이브러리 활용을 통해 문제를 해결하는 핵심 비전략을 정리해 드립니다.

목차

  1. lv2 문제 해결을 위한 사고방식의 전환
  2. 시간 복잡도와 효율성을 고려한 자료구조 선택
  3. 필수 알고리즘 패턴 익히기
  4. 파이썬 내장 라이브러리 200% 활용하기
  5. 코드의 가독성과 간결함을 높이는 리팩토링 기법
  6. 실전 테스트에서 흔히 저지르는 실수와 방지책

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시간의 타이머를 맞추고 집중해서 푸는 연습을 합니다.
  • 노트 정리: 막혔던 로직이나 몰랐던 라이브러리는 별도로 정리하여 시험 직전에 복습합니다.

댓글 남기기

이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.