본문 바로가기

DEV/문제풀이

Lesson 4(Counting Elements) - FrogRiverOne

반응형

 문제

A small frog wants to get to the other side of a river. The frog is initially located on one
bank of the river (position 0) and wants to get to the opposite bank (position X+1). 
Leaves fall from a tree onto the surface of the river.

You are given an array A consisting of N integers representing the falling leaves. A[K] 
represents the position where one leaf falls at time K, measured in seconds.

The goal is to find the earliest time when the frog can jump to the other side of the river. 
The frog can cross only when leaves appear at every position across the river from 1 to X 
(that is, we want to find the earliest moment when all the positions from 1 to X are covered
by leaves). You may assume that the speed of the current in the river is negligibly small, 
i.e. the leaves do not change their positions once they fall in the river.

For example, you are given integer X = 5 and array A such that:

  A[0] = 1
  A[1] = 3
  A[2] = 1
  A[3] = 4
  A[4] = 2
  A[5] = 3
  A[6] = 5
  A[7] = 4
In second 6, a leaf falls into position 5. This is the earliest time when leaves appear in 
every position across the river.

Write a function:

class Solution { public int solution(int X, int[] A); }

that, given a non-empty array A consisting of N integers and integer X, returns the earliest 
time when the frog can jump to the other side of the river.

If the frog is never able to jump to the other side of the river, the function should return 
−1.

For example, given X = 5 and array A such that:

  A[0] = 1
  A[1] = 3
  A[2] = 1
  A[3] = 4
  A[4] = 2
  A[5] = 3
  A[6] = 5
  A[7] = 4
the function should return 6, as explained above.

Write an efficient algorithm for the following assumptions:

N and X are integers within the range [1..100,000];
each element of array A is an integer within the range [1..X].

개구리는 시작위치 0에서 시작하여 목표위치X까지 가려고합니다. 배열 A가 주어지면 시작위치 0부터 목표X까지 연결이 되어지는 지점을 찾아 반환하는 문제입니다.

 

 

 풀이

 

class Solution {
    public int solution(int X, int[] A) {
        boolean [] checkArr = new boolean[X+1];
        int cnt = 0, resIdx = -1;

        for(int i=0;i<A.length;i++ ){
            if( checkArr[A[i]]  == false){
                checkArr[A[i]] = true;
                cnt++;
                if( cnt == X ){
                    resIdx = i;
                    break;
                } 
            }
        }

        return resIdx;
    }
}

 

1번부터 X번까지 길이 이어졌는지 확인을 위한 배열을 만듭니다.

배열의 값이 처음 나온 경우 카운트를 증가시켜 카운팅 된 수가 X와 같으면 목적지에 도착한 것입니다.

 

 결과

 

주소 : app.codility.com/demo/results/trainingPM8UK8-CCB/

 

제출결과1
제출결과2

정답율 100%에 반복문 한번으로 시간복잡도도 O(N) 으로 잘 나왔네요.

 

 

반응형
댓글