[codility] FrogRiverOne

2019, Oct 02    

문제 요약

배열 A에서 주어진 X까지 순차적으로 다 나온 배열인덱스를 리턴해주기 없을경우 -1

input : A = {3,1,2,4,3}
X = 5
A[0] = 1
A[1] = 3
A[2] = 1
A[3] = 4
A[4] = 2
A[5] = 3
A[6] = 5
A[7] = 4

output : 6

나의코드 72% O(N ** 2)

function solution(X, A) {
    // write your code in JavaScript (Node.js 8.9.4)
    let result = -1;
    let resultArr = [];
    let arrIdx = 0;
    for(let i=0;i < A.length; i++ ){
        if(X >= A[i]){
            if (resultArr.indexOf(A[i]) < 0 ){ 
                resultArr.push(A[i]);
            }
            if(resultArr.length == X){
                      result= i;
                      break
             }
        }
    }
    
    return result;

}

  • 중복제거를 indexOf 사용함으로써 복잡도 증가..

  • 중복제거를따로 하지않고 배열인덱스를 사용하여 100%로..

    100% code

function solution(X, A) {
    // write your code in JavaScript (Node.js 6.4.0) 

    let sequence = [0];
    let position = -1;
    let counter = 0;

    if (X === 1 && A[0] === 1)
        return 0;

    for (let i = 0; i <= A.length - 1; i++) {

        if (A[i] <= X) {
            if (!sequence[A[i]]) {
                counter++;
            }
            
            sequence[A[i]] = A[i];

            if (counter === X) {
                position = i;
                break;
            }
        }
    }
    return position;
}

  • 이번코드의경우 자바로 할경우 훨씬 간결하여 자바코드도 가져와보았다
// you can also use imports, for example:
import java.util.*;

// you can write to stdout for debugging purposes, e.g.
// System.out.println("this is a debug message");

class Solution {
    public int solution(int X, int[] A) {
        Set<Integer> per = new HashSet<>();
        for(int i=0; i<A.length; i++) {
            if(A[i] <= X) per.add(A[i]);
            if(per.size() == X) return i;
        }
        return -1;
    }
}