https://school.programmers.co.kr/learn/courses/30/lessons/42747#
발표논문 n개중, (h이상 인용된 논문이 h이상 + 나머지가 h이하)일때의 h
=> 즉 "h번 이상 인용된 논문이 h편 이상인 최대 h를 구하라" 가 문제의 요점인데 (아니 뭔 수수께끼나구요...)
설명과 예시 코드가 부족하고 표현이 애매해서 문제를 정확히 이해하지 못 했고 결국 다른 분의 해석을 보고 풀었다
핵심은 h의 최대값은 입력값 citations의 길이고,
인용된 횟수와 조건이 맞는 논문 갯수가 일치하는 최대값 구하기 문제이다
예를들어
citations = [ 9000,7000, 10000, 5000, 6000 ] 일때
1번 이상 인용된 논문 = 5편 >= 1편 이상
2번 이상 인용된 논문 = 5편 >= 2편 이상
3번 이상 인용된 논문 = 5편 >= 3편 이상
4번 이상 인용된 논문 = 5편 >= 4편 이상
5번 이상 인용된 논문 = 5편 >= 5편 이상
6번 이상 인용된 논문 = 5편 < 6편 미만
아무리 인용 횟수가 커도 h-index는 5이다
또한 문제에서 설명은 없었지만 내가 놓친 포인트들이다.
- 각 논문의 인용된 수는 중복이 가능하다. (즉 citations 배열 안에 중복이 있을 수 있다)
- answer은 citations의 값 외에도 될 수 있다. (나는 citations안 인용갯수만큼만 가능한 줄 알아서 [1,3] 이런 경우일때 h가 2인 경우를 빼먹었다.)
로직
- 먼저 h번 이상 인용된 논문의 갯수를 빨리 알기위해 citations를 오름차순으로 정리한다
- h는 0번부터 citations의 길이만큼 가능하므로 이를 순회한다
- 매번 h번 이상 인용된 논문의 갯수를 구하고 이것이 h번 이상이면 answer를 갱신한다.
function solution(citations) {
let answer = 0;
citations.sort((a, b) => a - b);
for (let h = 0; h <= citations.length; ++h) {
const count = citations.filter((c) => c >= h).length; // h이상인용된 눈문 갯수 구하기
// h이상 갯수가 h이상이면 answer갱신
if (count >= h) {
answer = h;
}
}
return answer;
}
filter로 h이상 인용된 논문 갯수 구하는 부분 최적화하기
while로 h미만까지의 인덱스를 구한 뒤 total논문 갯수에서 그 인덱스를 빼면 된다.
function solution(citations) {
let answer = 0;
citations.sort((a, b) => a - b);
const total = citations.length;
for (let h = 0; h <= citations.length; ++h) {
let i = 0;
// h미만까지 i옮기기
while (h > citations[i]) {
i++;
}
const count = total - i; // h이상 갯수
if (count >= h) {
answer = h;
}
}
return answer;
}
'알고리즘' 카테고리의 다른 글
[카카오2020] 괄호 변환 (0) | 2023.12.10 |
---|---|
[카카오2018] [3차] 파일명 정렬 (0) | 2023.12.09 |
[프로그래머스 lv2] 숫자 카드 나누기 (0) | 2023.12.08 |
줄 서는 방법 (0) | 2023.12.08 |
롤케이크 자르기 (0) | 2023.12.07 |