Codility Lesson4. Counting Elements - PermCheck

세나정·2023년 4월 25일
0
post-thumbnail

Tasks

N개의 정수로 구성된 비어 있지 않은 배열 A가 제공됩니다.

순열 은 1에서 N까지의 각 요소를 한 번만 포함하는 시퀀스입니다.

예를 들어 배열 A는 다음과 같습니다.

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

순열이지만 배열 A는 다음과 같습니다.

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

값 2가 없기 때문에 순열이 아닙니다.

목표는 배열 A가 순열인지 확인하는 것입니다.

함수 작성:

기능 솔루션(A);

배열 A가 주어지면 배열 A가 순열이면 1을 반환하고 그렇지 않으면 0을 반환합니다.

예를 들어 다음과 같은 배열 A가 있다고 가정합니다.

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

함수는 1을 반환해야 합니다.

주어진 배열 A는 다음과 같습니다.

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

함수는 0을 반환해야 합니다.

다음 가정에 대한 효율적인 알고리즘을 작성하십시오 .

N은 범위 [ 1 .. 100,000 ] 내의 정수이고;
배열 A의 각 요소는 [ 1 .. 1,000,000,000 ] 범위 내의 정수입니다 .

내 풀이

처음엔 단순하게 생각해서 배열의 최댓값 (끝값)이 길이와 같다면 1을 리턴 해주고
Set에 넣고 그 길이가 A의 길이와 같지 않다면 0을 리턴해주었는데

이 부분에서 자꾸 에러가 나왔다.. 그래서 이유를 살펴보니 총합은 같지만 순열이 아닐 때가 문제였다. (차이가 1씩이 아닌데 총합은 같은 경우)

// you can write to stdout for debugging purposes, e.g.
// console.log('this is a debug message');

function solution(A) {
    // Implement your solution here

    if (Math.max(...A) === A.length) {
        return 1
    } else if (new Set(A).size !== A.length) {
        return 0
    }
    return 0
}

83%

다른 사람 풀이

function solution(A) {
  A.sort((l, r) => l - r);
  
  if (A[0] !== 1) {
    return 0;
  }
  
  for (let i = 0; i < A.length - 1; i++) {
    if (A[i + 1] - A[i] !== 1) {
      return 0;
    }
  }
    
  return 1;
}

오름차순으로 정렬을 한 후에 첫번째 인자가 1이 아니라면 0을 리턴하고
배열인덱스 간의 차이가 1이 아닐때도 0을 리턴하고

그 밖에 경우에만 1을 리턴한다.

profile
기록, 꺼내 쓸 수 있는 즐거움

0개의 댓글