본문 바로가기
일반 학습/코딩 테스트

[프로그래머스] H-Index

by StelthPark 2022. 3. 24.

처리조건

풀이

문제가 잘 이해되지 않았다. 테스트 입출력도 1개뿐이다..

[3, 0, 6, 1, 5]

배열에 각 숫자들은 인용한 횟수이며 총 5개의 논문을 냈고 각 논문당 인용횟수를 나타낸다.

이 배열의 리턴값은 3이다. 각 논문당 인용횟수보다 큰 인용 횟수를 가진 논문이 있다면 갯수를 세어 자기 자신의 갯수를 더하여 A를 만들고 이 A가 자신의 인용횟수보다 크다면 자신의 인용 횟수가 최대값이 되고, 만약 작다면 A가 최대값이 되는 것이다. 그렇게 각 논문에서 나오는 결과의 최대값을 리턴해주면 된다.

 

쉽게 생각하면

 

"h번 이상 인용된 h개의 논문이 있으면 이때의 h를 리턴하면 됩니다.
3번 이상 인용된 논문이 4개 있으면 3을 리턴하고,
4번 이상 인용된 논문이 3개 있으면 3을 리턴합니다."

 

이 조건을 만족해야한다. 

 

sort로 배열의 오름차순으로 정리하고 자신을 기준으로 뒤에 당연히 같거나 더 큰 수가 배치되게 정렬 될 것이다. 그럼 여기서 자신을 기준으로 이중 for문을 돌려 A의 기준은 1로(자신을 포함하니) 자신보다 큰 수들을 찾을때마다 ++시킨다.

이후에 자신의 수보다 A가 크면 result를 자신으로 작으면 A를 result로 만든뒤 answer에 Math.max로 최대값을 계속 바꾸어준다.

 

로직을 짜는 건 쉽지만 문제를 이해하는게 더 어려운 문제..! 문제에 대한 설명을 더 추가해주거나 테스트 입출력을 몇 개만 더 보여줬으면 좋았을 것 같다. 

function solution(citations) {
  let answer = 0;

  citations.sort(function (a, b) {
    if (a > b) return 1;
    if (a === b) return 0;
    if (a < b) return -1;
  });

  for (let i = 0; i < citations.length - 1; i++) {
    let maxcount = 1;
    let mincount = citations[i];
    let result = 0;

    for (let j = i + 1; j < citations.length; j++) {
      if (citations[i] <= citations[j]) {
        maxcount++;
      }
    }

    if (maxcount >= mincount) result = mincount;
    else if (maxcount < mincount) result = maxcount;
    answer = Math.max(answer, result);
  }
  return answer
}

 

댓글