Skip to Content
WebJavaScriptJavaScript 코딩테스트02. 제한사항과 시간복잡도

학습 목표: 제한사항을 근거로 O(n), O(n log n), O(n²) 중 가능한 풀이를 판단합니다. 모든 예시는 주어진 매개변수를 처리해 정답을 반환하는 solution 함수로 완성합니다.

문제를 푸는 기준

모든 쌍을 직접 비교하기 전에 이미 본 값을 Set이나 Map에 기록해 한 번의 순회로 바꿀 수 있는지 확인합니다.

핵심 개념

개념코딩테스트에서의 역할
O(1)데이터 크기와 무관한 일정한 연산입니다.
O(n)전체 원소를 한 번 또는 상수 번 순회합니다.
O(n log n)정렬과 분할 정복에서 자주 나타납니다.
O(n²)모든 쌍을 확인하는 이중 반복에서 자주 나타납니다.

대표 문제

서로 다른 값 쌍 세기

정수 배열 numbers와 target이 주어집니다. 합이 target인 서로 다른 값 쌍의 개수를 반환하세요. 같은 값 쌍은 여러 번 등장해도 한 번만 셉니다.

함수 시그니처: solution(numbers, target)

제한사항

  • numbers의 길이는 1 이상 200,000 이하입니다.
  • 같은 값이 여러 번 등장할 수 있습니다.
  • 한 원소를 자기 자신과 두 번 사용할 수 없습니다.

입출력 예

매개변수반환값
[1, 4, 2, 3, 3], 52
[2, 2, 2], 41

풀이 설계

  1. seen에 앞에서 본 값을 기록합니다.
  2. 현재 값마다 target과의 차이를 찾습니다.
  3. 발견한 쌍은 작은 값과 큰 값으로 정규화해 pairs에 넣습니다.

JavaScript 풀이

function solution(numbers, target) { const seen = new Set(); const pairs = new Set(); for (const value of numbers) { const complement = target - value; if (seen.has(complement)) { const left = Math.min(value, complement); const right = Math.max(value, complement); pairs.add(left + ':' + right); } seen.add(value); } return pairs.size; }

복잡도

  • 시간복잡도: O(n)
  • 공간복잡도: O(n)
  • 핵심 패턴: 이미 본 값을 Set에 기록해 이중 반복 제거
  • 경계 사례: 같은 수 쌍은 그 값이 실제 두 번 등장해야 인정

연습 문제

1. 중복 존재

같은 값이 두 번 이상 있으면 true를 반환하세요.

힌트

Set 크기 비교

2. 첫 중복 위치

처음 두 번째로 등장한 값의 인덱스를 반환하세요.

힌트

seen Set

3. 세 수의 합

세 인덱스의 합이 target인 조합 수를 구하세요.

힌트

정렬과 투 포인터로 O(n²)

자주 하는 실수

  • 작은 예시만 보고 O(n²)을 선택하는 실수
  • 평균 O(1) 조회와 전체 O(n)을 혼동하는 실수
  • 값 쌍과 인덱스 쌍을 혼동하는 실수
  • 추가 메모리를 분석에서 빼는 실수

핵심 정리

  • 함수 시그니처와 반환 자료형을 먼저 확정합니다.
  • 제한사항으로 가능한 시간복잡도를 판단합니다.
  • 예시와 경계 사례를 손으로 추적한 뒤 구현합니다.
  • 완성한 solution 함수가 입력을 불필요하게 바꾸지 않는지도 확인합니다.

확인 문제

문제 14지선다
길이 200,000인 배열에서 모든 쌍을 비교하는 풀이의 문제는?
문제 24지선다
대표 문제의 시간복잡도로 알맞은 것은?
문제 34지선다
서로 다른 값 쌍 세기에서 사용한 핵심 패턴은?
문제 44지선다
대표 문제에서 반드시 확인할 경계 사례는?
문제 54지선다
이 과정의 정답 코드가 지켜야 할 계약은?

참고 자료

Last updated on