완전탐색과 쌍 비교: 중복 없는 후보 열거와 순위 계산

··설명 약 6분·작성: 해비·블로그 소개

읽기 전에 알아두면 좋아요

아래 개념이 익숙하면 본문을 바로 읽으세요. 낯선 개념만 링크에서 복습하면 됩니다.

개념과 예제는 실행하지 않아도 읽을 수 있습니다. 내 컴퓨터·터미널에서 직접 실행하는 과정은 선택 실습입니다.

과정 위치와 선택 복습 안내

과정 위치: 완전탐색과 격자 · 알고리즘 개념

과정 위치는 이 글이 속한 묶음입니다. 이 단계의 모든 개념을 먼저 읽을 필요는 없습니다. 위에 연결한 개념 중 낯선 내용만 복습하세요. 문제의 조건·상태·갱신 순서는 익숙한 언어로 설명하면 됩니다.

JavaScript로 문법·실행 복습하기 (선택)

개념 글의 코드는 JavaScript 예시입니다. 문제 화면에서는 JavaScript·Python·Java·C++·C# 중 익숙한 언어의 함수를 작성하세요. 본문의 Node.js 입출력 예시는 로컬 실행을 위한 별도 안내입니다.

완전탐색에서 두 위치의 쌍 열거와 공동 순위 계산은 무엇이 다른가요?

완전탐색은 가능한 후보를 빠짐없이 확인하는 방법입니다. 두 개를 고르는 문제와 각 사람을 전체와 비교하는 문제는 반복 범위가 다릅니다.

배열 2·5·3·5에서 합 7이 되는 서로 다른 두 인덱스 쌍
값이 같은 두 5도 위치가 다릅니다. 인덱스 쌍 (0,1)과 (0,3)을 각각 후보로 셉니다. 원본 보기 (새 탭)

[2,5,3,5]에서 합이 7인 인덱스 쌍은 (0,1)과 (0,3)입니다. 값이 같은 두 5도 서로 다른 위치입니다.

적용 조건·범위: 두 예제 모두 O(N²) 시간입니다. N=9의 쌍은 36개지만 N=100,000의 쌍은 4,999,950,000개입니다. 입력 제한과 후보당 계산량을 함께 보세요. 작은 입력에서는 단순한 완전탐색을 기준 답으로 삼아 더 빠른 풀이와 비교하기도 좋습니다.

본문 근거: Competitive Programmer’s Handbook — Antti Laaksonen

완전탐색과 쌍 비교 개념을 표현한 일러스트 표지

이 글에서 할 일: 쌍 열거와 공동 순위 계산에 맞는 반복 범위를 선택합니다. 선수 지식: 배열 인덱스·중첩 반복문.

순서 없는 쌍은 i보다 큰 j만 고릅니다

아래 JavaScript 예제는 서로 다른 두 위치를 골라 합이 목표값인 쌍을 찾습니다. 코드 아래의 결과를 보면서 같은 쌍을 두 번 세지 않는 반복 범위를 살펴보세요. 직접 실행하지 않아도 설명을 따라갈 수 있습니다.

i보다 큰 j만 비교하는 상삼각형 후보 표
대각선과 아래쪽을 제외하면 같은 원소와 대칭 쌍을 비교하지 않습니다. 합 7인 두 칸만 강조했습니다. 원본 보기 (새 탭)
function pairIndices(values, target) {
  const result = [];
  for (let i = 0; i < values.length; i++) {
    for (let j = i + 1; j < values.length; j++) {
      if (values[i] + values[j] === target) result.push([i, j]);
    }
  }
  return result;
}

console.log(JSON.stringify(pairIndices([2, 5, 3, 5], 7)));

실행 결과

[[0,1],[0,3]]

j = i + 1이면 자기 자신과 비교하지 않고, (i,j)와 (j,i)를 중복으로 세지 않습니다. 서로 다른 두 인덱스는 작은 인덱스를 i로 정하는 방법이 하나뿐이므로 모든 쌍을 정확히 한 번 방문합니다.

원소 N개에서 후보 수는 (N-1)+(N-2)+…+1 = N(N-1)/2입니다. 두 명을 제외하는 문제라면 전체 합에서 values[i]+values[j]를 빼고 조건을 확인할 수 있습니다. 찾은 뒤 나머지를 원래 순서대로 출력해야 한다면 입력을 임의로 정렬하지 않습니다.

내 컴퓨터에서 직접 실행하기 — 중복 없는 쌍 찾기 예제 (선택)

코드를 직접 바꿔보고 싶은 분을 위한 안내입니다. 이 과정은 방문자 자신의 컴퓨터에서 진행하며, 글을 읽기 위해 반드시 실행할 필요는 없습니다.

준비물: Node.js와 코드 편집기인 Visual Studio Code(VS Code). Node.js는 JavaScript 파일을 컴퓨터에서 실행하는 프로그램입니다. 아직 설치하지 않았다면 두 프로그램의 공식 사이트에서 설치한 뒤 진행하세요.

  1. 컴퓨터에 연습용 폴더를 하나 만들고, VS Code에서 파일 → 폴더 열기로 그 폴더를 엽니다.
  2. 그 폴더 안에 pairs.js 파일을 만듭니다. 위의 JavaScript 예제 전체를 복사해 붙여넣고 저장하세요. 마지막 console.log 줄도 포함하며, 파일 이름 끝이 .js.txt가 되지 않도록 확인합니다.
  3. VS Code의 터미널 → 새 터미널을 선택합니다. 아래쪽에 열린 터미널은 명령어를 입력하는 창입니다. 다음 명령으로 Node.js 설치 여부를 확인합니다.
node --version

v로 시작하는 버전 번호가 나오면 실행할 수 있습니다. 명령을 찾을 수 없다는 메시지가 나오면 Node.js를 설치하고 VS Code를 완전히 닫았다가 다시 여세요.

터미널의 현재 위치가 방금 파일을 저장한 폴더인지 확인한 뒤, 다음 명령을 입력하고 Enter를 누릅니다. 이 명령은 JavaScript 파일 안이 아니라 터미널에 입력합니다.

node pairs.js

터미널에 나온 값을 위의 실행 결과와 비교하세요. Cannot find module이 나오면 파일 이름과 저장 여부, 터미널에서 연 폴더가 같은지 확인합니다.

등수는 자신보다 큰 점수의 수에 1을 더합니다

아래 JavaScript 예제는 각 점수보다 큰 점수가 몇 개인지 세어 등수를 구합니다. 코드 아래의 결과와 표를 보면서 동점인 점수에 같은 순위가 매겨지는 이유를 살펴보세요. 직접 실행하지 않아도 설명을 따라갈 수 있습니다.

점수 80·90·90·70의 큰 점수 개수와 순위
자신보다 엄격히 큰 점수 개수에 1을 더합니다. 두 90의 순위는 같고 결과는 원래 순서대로 반환합니다. 원본 보기 (새 탭)
function ranks(scores) {
  const result = [];
  for (let i = 0; i < scores.length; i++) {
    let rank = 1;
    for (let j = 0; j < scores.length; j++) {
      if (scores[j] > scores[i]) rank++;
    }
    result.push(rank);
  }
  return result;
}

console.log(JSON.stringify(ranks([80, 90, 90, 70])));

실행 결과

[3,1,1,4]
공동 순위를 계산하는 기준
점수 더 큰 점수 수 등수
80 2 3
90 0 1
90 0 1
70 3 4

각 i의 등수를 구할 때는 j를 처음부터 끝까지 확인합니다. 이때 비교는 >입니다. 자신과 동점인 점수는 증가 조건을 통과하지 않습니다. >=로 바꾸면 자신과 동점자까지 더해져 결과가 달라집니다. 이 규칙은 1,1,3처럼 공동 순위 뒤의 등수를 건너뜁니다.

내 컴퓨터에서 직접 실행하기 — 공동 순위 계산 예제 (선택)

코드를 직접 바꿔보고 싶은 분을 위한 안내입니다. 이 과정은 방문자 자신의 컴퓨터에서 진행하며, 글을 읽기 위해 반드시 실행할 필요는 없습니다.

준비물: Node.js와 코드 편집기인 Visual Studio Code(VS Code). Node.js는 JavaScript 파일을 컴퓨터에서 실행하는 프로그램입니다. 아직 설치하지 않았다면 두 프로그램의 공식 사이트에서 설치한 뒤 진행하세요.

  1. 컴퓨터에 연습용 폴더를 하나 만들고, VS Code에서 파일 → 폴더 열기로 그 폴더를 엽니다.
  2. 그 폴더 안에 ranks.js 파일을 만듭니다. 위의 JavaScript 예제 전체를 복사해 붙여넣고 저장하세요. 마지막 console.log 줄도 포함하며, 파일 이름 끝이 .js.txt가 되지 않도록 확인합니다.
  3. VS Code의 터미널 → 새 터미널을 선택합니다. 아래쪽에 열린 터미널은 명령어를 입력하는 창입니다. 다음 명령으로 Node.js 설치 여부를 확인합니다.
node --version

v로 시작하는 버전 번호가 나오면 실행할 수 있습니다. 명령을 찾을 수 없다는 메시지가 나오면 Node.js를 설치하고 VS Code를 완전히 닫았다가 다시 여세요.

터미널의 현재 위치가 방금 파일을 저장한 폴더인지 확인한 뒤, 다음 명령을 입력하고 Enter를 누릅니다. 이 명령은 JavaScript 파일 안이 아니라 터미널에 입력합니다.

node ranks.js

터미널에 나온 값을 위의 실행 결과와 비교하세요. Cannot find module이 나오면 파일 이름과 저장 여부, 터미널에서 연 폴더가 같은지 확인합니다.

후보 수로 실행량을 판단합니다

두 예제 모두 O(N²) 시간입니다. N=9의 쌍은 36개지만 N=100,000의 쌍은 4,999,950,000개입니다. 입력 제한과 후보당 계산량을 함께 보세요. 작은 입력에서는 단순한 완전탐색을 기준 답으로 삼아 더 빠른 풀이와 비교하기도 좋습니다.

입력 크기 9와 100000일 때 중복 없는 쌍의 수
N(N−1)/2로 계산하면 9개는 36쌍, 100000개는 4,999,950,000쌍입니다. 원본 보기 (새 탭)

순위 결과 배열은 O(N) 공간, 쌍 결과는 정답 쌍이 P개이면 O(P) 공간입니다. 빈 입력은 빈 결과를 반환하고, 한 점수의 등수는 1입니다. 같은 숫자라도 인덱스가 다르면 별도 후보라는 점을 유지하세요.

직접 확인하고 문제에 적용하기

[5,5,5]의 등수와 합이 10인 쌍의 수는 각각 얼마일까요?

5가 세 개 있는 배열의 순위와 합 10인 쌍 개수를 묻는 문제
같은 값도 인덱스가 다른 세 원소입니다. 순위 배열과 인덱스 쌍 개수를 각각 생각해 보세요. 원본 보기 (새 탭)
답과 이유 확인

등수는 [1,1,1], 쌍의 수는 3입니다. 공동 순위는 같은 값끼리 증가하지 않지만, 쌍 열거에서는 서로 다른 세 인덱스 쌍을 각각 셉니다.

참고 자료

자료 확인일: 2026년 10월 19일.

이 글이 도움이 되었나요?

조회 중

이어서 공부하기

체크포인트: 예제의 상태 변화를 손으로 추적하고 아래 문제에 적용하세요. 값이 없는 경우와 원소 하나인 경우도 설명해 보세요. 같은 쌍을 두 번 세지 않는 이유와 모서리·대각선의 좌표를 설명하세요.

이 개념으로 더 풀어보기

다음 추천 · 이 개념으로 풀 문제: 일곱 난쟁이 풀이: 두 명을 제외하는 완전탐색

같은 주제의 문제에 적용하며 방금 배운 개념을 확인합니다.

권장 순서는 학습 가이드와 같습니다. 다른 순서는 접힌 참고 목록에서 확인할 수 있습니다. 읽음 표시는 숙달이나 채점 결과가 아닙니다.

원래 과정 목록 순서 (선택)

읽음 기록

읽음 — / 전체 30개 · 필수 0개

이 글을 쓴 해비

웹사이트를 제작·운영하고, 개인 서비스와 자동화·AI 도구를 만듭니다. 직접 만들며 배운 내용과 문제 해결 과정을 BlogFlow에 기록합니다.

새 글 받아보기

RSS 리더에서 BlogFlow의 새 글을 확인할 수 있습니다.

RSS 피드 구독하기

댓글 남기기