{}연습장
대시보드학습스킬 경로문제모의고사라이브 코테복습데이터
문제 목록〉해시〉재스캔 지점 찾기← 이전다음 →
#017 · 해시쉬움해시 집합,조기 종료

재스캔 지점 찾기

문제

도서관 반납함에 책이 들어올 때마다 바코드 리더가 도서 코드를 하나씩 읽어 기록합니다. 기록은 읽힌 순서대로 codes 배열에 담겨 있습니다.

이미 읽은 적 있는 도서 코드가 또 읽혔다면 같은 책이 두 번 스캔된 것이므로 그 시점에서 경고를 띄워야 합니다.

앞에서부터 읽어 나갈 때 경고가 처음으로 발생하는 인덱스 를 반환하는 solution(codes) 함수를 작성하세요. 끝까지 그런 코드가 없으면 -1을 반환합니다. 반환하는 인덱스는 뒤에 다시 등장한 쪽 의 인덱스입니다.

예시

codes=["B103","B441","B207","B103","B441"] → 3
  인덱스 3의 "B103"은 인덱스 0에서 이미 읽힌 코드다.
  "B441"도 중복이지만 더 뒤(인덱스 4)에서 확정되므로 답이 아니다.
 
codes=["A11","A12","A13"]                  → -1
  모든 코드가 서로 다르다.
 
codes=["Z9","Z9"]                          → 1
 
codes=["Q1","Q2","Q1","Q2"]                → 2

제약 조건

  • 1 ≤ codes.length ≤ 100,000
  • codes[i]는 길이 1 이상 10 이하이며 영문 대문자와 숫자로만 이루어집니다
  • 두 코드는 문자열이 완전히 같을 때만 같은 코드로 봅니다

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

테스트 케이스

예시 1: 인덱스 3에서 "B103" 재등장
입력: codes = ["B103","B441","B207","B103","B441"]
출력: 3
예시 2: 중복 없음
입력: codes = ["A11","A12","A13"]
출력: -1
예시 3: 두 번째 스캔에서 바로 확정
입력: codes = ["Z9","Z9"]
출력: 1
예시 4: 더 앞에서 확정되는 쪽을 골라야 함
입력: codes = ["Q1","Q2","Q1","Q2"]
출력: 2
엣지: 기록이 하나뿐
입력: codes = ["X7"]
출력: -1
엣지: 맨 끝에서야 중복 확정
입력: codes = ["K1","K2","K3","K4","K5","K6","K1"]
출력: 6
solution.ts
에디터 로딩 중…

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