읽기 전에 알아두면 좋아요
아래 개념이 익숙하면 본문을 바로 읽으세요. 낯선 개념만 링크에서 복습하면 됩니다.
- 문자열 알고리즘 기초: 순회·문자 판별·대소문자 변환·숫자 추출문자열의 각 문자를 순서대로 읽고 위치를 확인하는 방법을 복습합니다.
- 최솟값 구하기 풀이|배열 순회와 비교 갱신 원리값을 하나씩 읽으며 지금까지의 합이나 최댓값을 갱신하는 방법을 복습합니다.
개념과 예제는 실행하지 않아도 읽을 수 있습니다. 내 컴퓨터·터미널에서 직접 실행하는 과정은 선택 실습입니다.
과정 위치와 선택 복습 안내
과정 위치: 문자열 응용 · 알고리즘 개념
과정 위치는 이 글이 속한 묶음입니다. 이 단계의 모든 개념을 먼저 읽을 필요는 없습니다. 위에 연결한 개념 중 낯선 내용만 복습하세요. 문제의 조건·상태·갱신 순서는 익숙한 언어로 설명하면 됩니다.
JavaScript로 문법·실행 복습하기 (선택)
개념 글의 코드는 JavaScript 예시입니다. 문제 화면에서는 JavaScript·Python·Java·C++·C# 중 익숙한 언어의 함수를 작성하세요. 본문의 Node.js 입출력 예시는 로컬 실행을 위한 별도 안내입니다.
문자열의 각 위치에서 가장 가까운 목표 문자까지 거리를 어떻게 구하나요?
각 위치에서 가장 가까운 목표 문자는 왼쪽의 최근 목표 또는 오른쪽의 최근 목표 중 하나입니다. 두 번 순회해 두 거리를 구한 뒤 작은 값을 남깁니다.

abaca에서 a까지의 거리는 [0,1,0,1,0]입니다. 목표 문자가 있는 위치의 거리는 0입니다.
적용 조건·범위: 위 코드는 ASCII 문자열과 길이 1인 ASCII 목표 문자를 받습니다. 다른 문자 범위를 처리할 때는 먼저 인덱스 단위를 통일하세요. 코드 포인트 배열을 사용하면 거리도 코드 포인트 개수 기준이 되며, 화면에 보이는 글자 수와 항상 같지는 않습니다.
본문 근거: ECMAScript 2025 — String

이 글에서 할 일: 두 방향의 최근 위치를 합쳐 모든 칸의 최소거리를 구합니다. 선수 지식: 문자열 인덱스·반복문·최솟값.
최근 목표 위치를 방향마다 기록합니다
JavaScript 예제: 문자열을 양쪽 방향으로 훑어 각 위치에서 목표 문자까지의 최소거리를 구합니다. 아래 코드와 실행 결과를 읽고, 이어지는 거리 표로 두 방향의 값을 어떻게 합치는지 살펴보세요. 직접 실행하지 않아도 설명을 따라갈 수 있습니다.

function nearestTarget(text, target) {
// 계약: text는 ASCII 문자열, target은 ASCII 문자 하나
const distance = Array(text.length).fill(Infinity);
let last = -Infinity;
for (let i = 0; i < text.length; i++) {
if (text[i] === target) last = i;
distance[i] = i - last;
}
last = Infinity;
for (let i = text.length - 1; i >= 0; i--) {
if (text[i] === target) last = i;
distance[i] = Math.min(distance[i], last - i);
}
return distance.map(d => d === Infinity ? -1 : d);
}
console.log(JSON.stringify(nearestTarget('abaca', 'a')));
console.log(JSON.stringify(nearestTarget('bbb', 'a')));
실행 결과
[0,1,0,1,0]
[-1,-1,-1]
왼쪽 순회에서 last는 현재 위치 이하에서 가장 최근에 만난 목표의 인덱스입니다. 목표를 만나면 먼저 last를 현재 인덱스로 바꿔 거리 0을 저장합니다. 오른쪽 순회에서는 last가 현재 위치 이상에서 가장 가까운 목표가 됩니다.
아직 목표를 만나지 못한 방향의 거리는 Infinity로 둡니다. 두 순회가 끝나도 무한대라면 목표 문자가 아예 없는 경우입니다. 위 함수는 그 위치를 -1로 반환하도록 계약을 정했습니다. 원래 문제에서 목표의 존재를 보장한다면 이 경우는 입력 범위 밖입니다.
두 후보 중 작은 거리만 남깁니다

| 위치 | 왼쪽 거리 | 오른쪽 거리 | 결과 |
|---|---|---|---|
| 0: a | 0 | 0 | 0 |
| 1: b | 1 | 1 | 1 |
| 2: a | 0 | 0 | 0 |
| 3: c | 1 | 1 | 1 |
| 4: a | 0 | 0 | 0 |
왼쪽에 목표가 여럿 있더라도 가장 오른쪽 목표가 현재 칸과 가장 가깝습니다. 오른쪽에서는 가장 왼쪽 목표만 남기면 됩니다. 모든 목표는 왼쪽 또는 오른쪽에 있으므로 이 두 후보의 최솟값이 전체 최솟값입니다. 이것이 두 순회가 충분한 이유입니다.
양끝 포인터를 동시에 움직이는 투 포인터와는 상태가 다릅니다. 여기서는 첫 순회의 위치별 결과를 저장한 뒤 두 번째 순회 결과와 결합합니다. 왼쪽에서만 계산하면 문자열 앞쪽에서 오른쪽 목표까지의 거리를 놓칩니다.
내 컴퓨터에서 직접 실행하기 — 가장 가까운 문자 찾기 예제 (선택)
코드를 직접 바꿔보고 싶은 분을 위한 안내입니다. 이 과정은 방문자 자신의 컴퓨터에서 진행하며, 글을 읽기 위해 반드시 실행할 필요는 없습니다.
준비물: Node.js와 코드 편집기인 Visual Studio Code(VS Code). Node.js는 JavaScript 파일을 컴퓨터에서 실행하는 프로그램입니다. 아직 설치하지 않았다면 두 프로그램의 공식 사이트에서 설치한 뒤 진행하세요.
- 컴퓨터에 연습용 폴더를 하나 만들고, VS Code에서 파일 → 폴더 열기로 그 폴더를 엽니다.
- 그 폴더 안에
nearest-target.js파일을 만듭니다. 위의 JavaScript 예제 전체를 복사해 붙여넣고 저장하세요. 마지막console.log줄도 포함하며, 파일 이름 끝이.js.txt가 되지 않도록 확인합니다. - VS Code의 터미널 → 새 터미널을 선택합니다. 아래쪽에 열린 터미널은 명령어를 입력하는 창입니다. 다음 명령으로 Node.js 설치 여부를 확인합니다.
node --version
v로 시작하는 버전 번호가 나오면 실행할 수 있습니다. 명령을 찾을 수 없다는 메시지가 나오면 Node.js를 설치하고 VS Code를 완전히 닫았다가 다시 여세요.
터미널의 현재 위치가 방금 파일을 저장한 폴더인지 확인한 뒤, 다음 명령을 입력하고 Enter를 누릅니다. 이 명령은 JavaScript 파일 안이 아니라 터미널에 입력합니다.
node nearest-target.js
터미널에 나온 값을 위의 실행 결과와 비교하세요. Cannot find module이 나오면 파일 이름과 저장 여부, 터미널에서 연 폴더가 같은지 확인합니다.
문자 단위와 목표 부재를 먼저 정합니다
위 코드는 ASCII 문자열과 길이 1인 ASCII 목표 문자를 받습니다. 다른 문자 범위를 처리할 때는 먼저 인덱스 단위를 통일하세요. 코드 포인트 배열을 사용하면 거리도 코드 포인트 개수 기준이 되며, 화면에 보이는 글자 수와 항상 같지는 않습니다.

빈 문자열의 결과는 빈 배열입니다. 목표가 연속해 나오면 해당 위치가 모두 0입니다. 목표가 한쪽 끝에만 있으면 거리가 한 칸씩 증가합니다. 길이 N에 대해 세 번의 선형 처리로 O(N) 시간, 결과와 변환 배열에 O(N) 공간을 사용합니다. 목표 위치를 모든 칸에서 다시 찾는 O(N²) 방식보다 반복을 줄입니다.
직접 확인하고 문제에 적용하기
baaa에서 a를 찾으면 어떻게 될까요? abb에서 a를 찾을 때도 두 순회가 같은 계약을 지키는지 확인해 보세요.

답과 이유 확인
각각 [1,0,0,0], [0,1,2]입니다. 목표가 연속하거나 왼쪽 끝에만 있어도 목표 위치에서 last를 먼저 갱신하면 같은 규칙이 유지됩니다.
참고 자료
자료 확인일: 2026년 10월 19일.
- ECMAScript 2025 — String — 문자열 인덱스·반복에서 사용할 문자 단위.
이 글이 도움이 되었나요?
이어서 공부하기
체크포인트: 예제의 상태 변화를 손으로 추적하고 아래 문제에 적용하세요. 값이 없는 경우와 원소 하나인 경우도 설명해 보세요. 전처리할 문자와 비교할 문자를 구분하고 마지막 문자·마지막 묶음을 확인하세요.
다음 추천 · 이 개념으로 풀 문제: 가장 짧은 문자거리 풀이: 양방향 탐색으로 최소거리 구하기
권장 순서는 학습 가이드와 같습니다. 다른 순서는 접힌 참고 목록에서 확인할 수 있습니다. 읽음 표시는 숙달이나 채점 결과가 아닙니다.
원래 과정 목록 순서 (선택)
읽음 기록
읽음 — / 전체 30개 · 필수 0개
새 글 받아보기
RSS 리더에서 BlogFlow의 새 글을 확인할 수 있습니다.