본문 바로가기
알고리즘

프로그래머스 고득점 kit - 정렬 - h-index / javascript

by 자유코딩 2020. 7. 20.

정렬 문제 3번째 h-index 를 풀었다.

이런 문제다.

 

답은 이렇다.

function solution(citations) {
  citations = citations.sort((a, b) => b - a); // 정렬한다.
  if (citations[0] === 0) {
    return 0;
  }
  if (citations[citations.length - 1] >= citations.length) {
    return citations.length;
  }
  for (let index = 0; index < citations.length; index++) {
    if (index >= citations[index]) {
      return index;
    }
  }
}

 

처음에는 반복문을 1부터 1000까지 돌고 그 안에서 count를 증가시키려고 했다.

이중 for 문이었고 답도 맞지 않았다.

 

문제에서 중요한 사실이 있다.

1. h-index의 최대값은 절대 배열의 크기를 넘을 수 없다.

[123, 11, 11] 의 h-index는 4가 될 수 없다.

전체 개수가 3이다.

4를 넘는게 4개 존재하지 않기 때문이다.

 

2. 일반적인 경우 내림차순 정렬 후에 인덱스가 배열 값을 넘는 지점에서 답이 나온다.

[30615] 의 경우

 

[6 5 3 1 0] 이 된다.

그리고

숫자    6 5 3 1 0

인덱스 0 1 2 3 4

3이 답이 된다.

 

3. 만약에 숫자가 모두 같은 경우는 어떨까

[5,5,5,5,5] 이 경우 답은 5이다.

인덱스는 4까지만 존재한다.

5, 5, 5, 5, 5

0, 1, 2, 3, 4 이러면 계속해서 인덱스가 숫자보다 작다.

 

값을 찾을 수 없게 된다.

이렇게 citations 배열의 모든 값이 인덱스의 최대 값보다 크면 배열 길이를 리턴하도록 하면된다.

1의 규칙에 따라서 h-index 값은 배열의 길이를 넘을 수 없기 때문이다.

 

4. 배열의 최대값이 0인 경우 h-index는 0이다.

 

이 1,2,3,4를 바탕으로 코드를 작성하면 이렇다.

먼저 정렬한다.

  citations = citations.sort((a, b) => b - a); // 정렬한다.

 

4에 따라 아래 내용을 먼저 작성한다.

 if (citations[0] === 0) {
    return 0;
  }

 

3에 따라서 아래 내용을 작성한다.

  if (citations[citations.length - 1] >= citations.length) {
    return citations.length;
  }

모든 숫자가 인덱스의 최대값보다 크다면 배열의 길이 = (최대 h-index)를 리턴한다.

만약 배열이 [5,5,5,5,5] 라면 여기서 처리된다.

 

가장 큰 인덱스 4가 5보다 작기 때문이다.

 

2에 따라서 아래 내용을 작성한다.

for (let index = 0; index < citations.length; index++) {
    if (index >= citations[index]) {
      return index;
    }
  }

앞의 코드에서 해당되지 않는 일반적인 경우에는 교차 지점의 인덱스를 리턴한다.

 

 

 

댓글