본문 바로가기

이론/문제풀이

[Codility] Lesson 3- PermCheck

진짜 별거아닌줄알았는데 고전했다 ㅋㅋㅋㅋㅋㅋㅋㅋㅋ

처음에 1부터N까지 한번씩만 나온다는줄 알고 총 합으로 구했다가 ㅋㅋㅋㅋㅋ ㅠ__ㅠ 별거아닌데 생각할게 많았던 문제!


생각할 조건은 간단하다.

1. 원소가 중복된 값은 아닌지?

2. 1-N사이의 값이 맞는지?


이 두개만 만족하면 이 배열은 순열이다.

class Solution {
    public int solution(int[] A) {
        int[] check=new int[A.length+1];
        if(A.length==1)//A의 길이가 1인경우
        {
            if(A[0]==1) return 1;
            return 0;
        }
        for(int i=0; i<A.length; i++){
            if(A[i]>A.length ||check[A[i]]==1)//이미 counting
                return 0;
            check[A[i]]=1; //counting
        }
        
        return 1;
    }
}

A의 길이가 1인경우에 굳이 아래까지 가지 않기 위해 basecase 설정해주었다.

그리고 한 숫자가 여러번 나올 경우를 체크하기 위해 check 배열을 선언해주었다.



if(A[i]>A.length ||check[A[i]]==1) 이게 핵심이었다.

A의 각 원소는 N까지만 있을 수 있으니 N보다 크면 바로 false를 리턴하고, 그렇지 않으면 중복된 값인지 체크한다.


이 포문을 전부 다 돌았다면 중복되는 숫자가 없는 것이므로 true를 리턴해준다