정렬 문제 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. 일반적인 경우 내림차순 정렬 후에 인덱스가 배열 값을 넘는 지점에서 답이 나온다.
[3, 0, 6, 1, 5] 의 경우
[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;
}
}
앞의 코드에서 해당되지 않는 일반적인 경우에는 교차 지점의 인덱스를 리턴한다.
'알고리즘' 카테고리의 다른 글
병합 정렬 javascript / merge sort (0) | 2020.07.26 |
---|---|
leetcode - sort list / javascript (0) | 2020.07.25 |
leetcode 알고리즘 - Intersection of Two Arrays II (0) | 2020.07.20 |
프로그래머스 - 코딩테스트 고득점 kit - 정렬 - 가장 큰 수 / javascript (0) | 2020.07.19 |
알고리즘 문제 (0) | 2019.12.12 |
댓글