[Codility] Counting Elements - PermCheck 풀이

예문


https://app.codility.com/programmers/lessons/4-counting_elements/perm_check/

A non-empty array A consisting of N integers is given.

A permutation is a sequence containing each element from 1 to N once, and only once.

For example, array A such that:

    A[0] = 4
    A[1] = 1
    A[2] = 3
    A[3] = 2

is a permutation, but array A such that:

    A[0] = 4
    A[1] = 1
    A[2] = 3

is not a permutation, because value 2 is missing.

The goal is to check whether array A is a permutation.

Write a function:

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

that, given an array A, returns 1 if array A is a permutation and 0 if it is not.

For example, given array A such that:

    A[0] = 4
    A[1] = 1
    A[2] = 3
    A[3] = 2

the function should return 1.

Given array A such that:

    A[0] = 4
    A[1] = 1
    A[2] = 3

the function should return 0.

Write an efficient algorithm for the following assumptions:

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

해석

  • 배열 A : N개의 비어있지 않는 정수로 구성
  • 순열 : 1 ~ N 까지 각 요소를 한번만 포함하는 시퀀스
    • 시퀀스이므로 순차적으로 증가 해야 함. 배열 크기 1 은 시퀀스가 아님
  • 배열 A가 순열이면 1, 비순열이면 0 리턴하라!

풀이

  • 인덱스에 따른 체크 배열 사용

제약사항

  • N의 범위는 정수 [1..100,000]
  • A의 각 요소의 범위는 정수 [1..1,000,000,000]

코드

public int solution(int[] A) {
    boolean[] checker = new boolean[A.length + 1];
    int num;
    for (int i = 0; i < A.length; i++) {
        num = A[i];
        if (num < checker.length) checker[num] = true;
    }

    for (int i = 1; i < checker.length; i++) {  //A배열의 값을 checker의 인덱스로 활용
        if (false == checker[i]) return 0;
    }
    return 1;
}

결과