Skip to content

FrogRiverOne

문제 설명

개구리가 위치 0에서 위치 X로 이동해야 한다. 배열 A의 인덱스는 시간, 값은 나뭇잎이 떨어진 위치를 나타낸다. 1부터 X까지 모든 위치에 나뭇잎이 채워지는 최소 시간을 구하고, 불가능하면 -1을 반환.

입력

  • 정수 X (목표 위치)
  • 배열 A (각 시간 tA[t] 위치에 나뭇잎이 떨어짐)

출력

  • 개구리가 X까지 도달할 수 있는 최소 시간, 불가능하면 -1

예제

typescript
X = 5
A = [1, 3, 1, 4, 2, 3, 5, 4]
  • 시간 0: 위치 1
  • 시간 1: 위치 3
  • 시간 3: 위치 4
  • 시간 4: 위치 2
  • 시간 6: 위치 5 (1~5 모두 채워짐)

결과: 6


이전 코드 (O(N * X))

typescript
function solution(X: number, A: number[]): number {
  const leaves = Array(X + 1).fill(false)
  leaves[0] = true

  const isFull = () => leaves.every(Boolean)
  let leafIdx = 0
  while (leafIdx < A.length) {
    leaves[A[leafIdx]] = true
    if (isFull()) break
    leafIdx++
  }
  return leafIdx
}

매 반복마다 every()로 전체 배열을 확인하기 때문에 비효율적.


개선된 코드 (O(N))

typescript
function solution(X: number, A: number[]): number {
  const leaves = new Set<number>()

  for (let time = 0; time < A.length; time++) {
    leaves.add(A[time])
    if (leaves.size === X) return time
  }

  return -1
}

Set.size === X로 조건 판별하여 O(N)에 해결.


테스트

typescript
console.log(solution(5, [1, 3, 1, 4, 2, 3, 5, 4])) // 출력: 6
console.log(solution(5, [1, 3, 1, 4, 2, 3])) // 출력: -1 (5가 없음)
console.log(solution(2, [2, 2, 2, 2, 2, 2])) // 출력: -1 (1이 없음)
console.log(solution(1, [1])) // 출력: 0