Problem
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:
int solution(int X, int A[], int N);
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.
Assume that:
- N and X are integers within the range [1..100,000];
- each element of array A is an integer within the range [1..X].
Complexity:
- expected worst-case time complexity is O(N);
- expected worst-case space complexity is O(X) (not counting the storage required for input arguments).
Copyright 2009–2018 by Codility Limited. All Rights Reserved. Unauthorized copying, publication or disclosure prohibited.
Solution Code
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 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 | package io.dorbae.study.algorithm.codility.countingelements; import java.util.HashSet; import java.util.Set; /***************************************************************** * * FrogRiverOne.java * 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. Assume that: N and X are integers within the range [1..100,000]; each element of array A is an integer within the range [1..X]. Complexity: expected worst-case time complexity is O(N); expected worst-case space complexity is O(X) (not counting the storage required for input arguments). Copyright 2009–2018 by Codility Limited. All Rights Reserved. Unauthorized copying, publication or disclosure prohibited. * ***************************************************************** * * @version 0.0.0 2018-06-04 23:12:05 dorbae 최초생성 * @since 1.0 * @author dorbae(dorbae.io@gmail.com) * */ public class FrogRiverOne { private static final int RESCODE_INVALID = -1; private static final int RESCODE_CANT_CROSS = -1; /** * * * @version 1.1.0 2018-06-04 23:52:01 dorbae Array -> Set. and modify logic error * @version 1.0.0 2018-06-04 23:21:41 dorbae 최초생성 * @since 1.0.0 * @author dorbae(dorbae.io@gmail.com) * * @param X : the position * @param A * @return */ public int solution( int X, int[] A) { // Illegal Argument if ( A == null) { System.err.println( "Invalid array A."); return RESCODE_INVALID; } int N = A.length; if ( N < 1 || N > 100000) { System.err.println( "Invalid length of array"); return RESCODE_INVALID; } if ( X < 1 || X > 100000) { System.err.println( "Invalid position X"); return RESCODE_INVALID; } // Initial Check Set Set< Integer> leafExistsChecker = new HashSet< Integer>(); for ( int ll = 1; ll <= X; ll++) { leafExistsChecker.add( ll); } for ( int ll = 0; ll < N; ll++) { if ( A[ ll] < 1 || A[ ll] > X) { System.err.println( "Invalid element in array"); return RESCODE_INVALID; } if ( leafExistsChecker.remove( A[ ll])) { // New one if ( leafExistsChecker.isEmpty()) return ll; } } return RESCODE_CANT_CROSS; } /** * * * @version 1.0.0 2018-06-04 23:35:11 dorbae 최초생성 * @since 1.0.0 * @author dorbae(dorbae.io@gmail.com) * * @param leafExistChecker * @return */ @Deprecated private static boolean isRelay( boolean[] leafExistChecker) { for ( int ll = 1; ll < leafExistChecker.length; ll++) { if ( !leafExistChecker[ ll]) { return false; } } return true; } } |