작은 개구리가 강을 건너가려고 합니다.
개구리는 처음에 강의 한쪽 둔덕(위치 0)에 있으며, 반대편 둔덕(위치 X+1)으로 가고자 합니다.
나뭇잎들이 강 표면에 떨어집니다.

배열 A는 떨어지는 나뭇잎들을 나타내는 N개의 정수로 이루어져 있습니다.
A[K] 는 K초(시간 K)에 나뭇잎이 떨어진 위치를 의미합니다.

목표:
개구리가 강 반대편으로 건널 수 있는 가장 이른 시각을 구하세요.
개구리는 1부터 X까지 모든 위치에 나뭇잎이 놓였을 때만(즉, 1..X의 모든 위치가 덮였을 때만)
건널 수 있습니다.
강의 유속은 무시할 수 있을 정도로 매우 작다고 가정하며, 한 번 떨어진 나뭇잎의 위치는 변하지 않습니다.

예시:
X = 5
A = [1, 3, 1, 4, 2, 3, 5, 4]

6초에 위치 5에 나뭇잎이 떨어집니다.
이 시점에서 1..5의 모든 위치가 나뭇잎으로 덮이므로, 개구리가 건널 수 있는 가장 이른 시각은 6입니다.

함수 규격:
class Solution {
    public int solution(int X, int[] A);
}
- 비어 있지 않은 정수 배열 A와 정수 X가 주어졌을 때,
  개구리가 강을 건널 수 있는 가장 이른 시각을 반환합니다.
- 만약 끝까지 모든 위치(1..X)가 덮이지 않아 개구리가 건널 수 없다면, -1을 반환합니다.

효율적 알고리즘 조건:
- N, X는 [1..100,000] 범위의 정수입니다.
- 배열 A의 각 원소는 [1..X] 범위의 정수입니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
public class FrogRiverOne
{
    public int solution(int X, int[] A)
    {
        bool[] coveredLeaf = new bool[X + 1]; 
        int nextLeaf = 1;                      
 
        for (int i = 0; i < A.Length; i++)
        {
            int pos = A[i];
 
            // 이미 덮인 나뭇잎 무시
            if (coveredLeaf[pos])
                continue;    
            
            // 나뭇잎 덮기
            coveredLeaf[pos] = true;           
 
            // 연속해서 덮인 만큼 nextLeaf를 앞으로 밀어줌
            while (nextLeaf <= X && coveredLeaf[nextLeaf])
                nextLeaf++;
 
            // 모두 덮이면 nextLeaf == X+1
            if (nextLeaf == X + 1)
                return i;                      
        }
 
        return -1// 끝까지 못 덮이면 -1
    }
}
cs

'코딜리티 > Lesson' 카테고리의 다른 글

MaxCounters (지연 갱신)  (0) 2025.09.15
PermCheck (순열)  (0) 2025.09.15
TapeEquilibrium (누적합 + 이항)  (0) 2025.09.15
PermMissingElem (등차수열)  (0) 2025.09.14
FrogJmp  (0) 2025.09.14

+ Recent posts