{}연습장
대시보드학습스킬 경로문제모의고사라이브 코테복습데이터
문제 목록〉해시〉다음 같은 화물까지의 거리← 이전다음 →
#079 · 해시쉬움해시 / 단일 순회

다음 같은 화물까지의 거리

문제

물류 센터의 컨베이어를 따라 화물이 한 줄로 지나갑니다. 각 화물에는 분류 코드가 영문 소문자 한 글자로 찍혀 있고, 지나간 순서대로 이어 적은 것이 문자열 s 입니다.

작업자는 화물마다 "같은 코드의 화물이 몇 칸 뒤에 또 오는지"를 알고 싶어 합니다. 각 위치 i 에 대해 다음을 계산해 배열로 반환하세요.

  • i 보다 뒤쪽에서 s[i] 와 같은 글자가 가장 먼저 나오는 위치를 j 라 할 때, 거리 j - i
  • 뒤쪽에 같은 글자가 더 이상 없으면 -1
solution(s: string): number[]

예시

s 반환값
"kayak" [4, 2, -1, -1, -1]
"cocoa" [2, 2, -1, -1, -1]
"zzz" [1, 1, -1]
"melon" [-1, -1, -1, -1, -1]

"kayak" 의 계산 과정:

k(0): 뒤쪽의 k는 4번 → 4 - 0 = 4
a(1): 뒤쪽의 a는 3번 → 3 - 1 = 2
y(2): 뒤에 y 없음 → -1
a(3): 뒤에 a 없음 → -1
k(4): 뒤에 k 없음 → -1

마지막 글자는 언제나 -1 이며, "melon" 처럼 모든 글자가 서로 다르면 전부 -1 입니다.

제약 조건

  • 1 ≤ s.length ≤ 100,000
  • s 는 영문 소문자로만 이루어져 있습니다
  • 반환 배열의 길이는 s 의 길이와 같습니다

시간 복잡도 목표: O(N)

테스트 케이스

예시 1: kayak
입력: s = "kayak"
출력: [4,2,-1,-1,-1]
예시 2: cocoa
입력: s = "cocoa"
출력: [2,2,-1,-1,-1]
예시 3: 같은 코드가 연달아
입력: s = "zzz"
출력: [1,1,-1]
예시 4: 모든 코드가 서로 다름
입력: s = "melon"
출력: [-1,-1,-1,-1,-1]
화물 한 개
입력: s = "q"
출력: [-1]
앞쪽에만 재등장이 있는 경우
입력: s = "seesaw"
출력: [3,1,-1,-1,-1,-1]
멀리 떨어져 재등장
입력: s = "tomato"
출력: [4,4,-1,-1,-1,-1]
여러 코드가 뒤섞인 경우
입력: s = "carpetcart"
출력: [6,6,6,-1,-1,4,-1,-1,-1,-1]
solution.ts
에디터 로딩 중…

▶ 실행은 기록 없이 채점만, 제출은 결과가 진행률·오답노트에 기록됩니다.