HomeAboutMeBlogGuest
© 2025 Sejin Cha. All rights reserved.
Built with Next.js, deployed on Vercel
🤎
프론트엔드 데브코스 5기 교육생
/
🙆
박병현팀
/
📏
H-Index
📏

H-Index

레벨
LV.2
날짜
Nov 2, 2023
링크
https://school.programmers.co.kr/learn/courses/30/lessons/42747

🔎 문제


 
 

🧩 구현과정 및 코드

개인 토글 영역에 구현 과정과 코드를 자유롭게 작성해주시면 됩니다.

사용할 데이터 구조와 풀이 방향성
사용할 데이터 구조와 풀이 방향성
적용할 알고리즘 혹은 메서드
적용할 알고리즘 혹은 메서드

수영


구현

  1. citations 내림차순 정렬
  1. 인용 횟수(citation)가 논문의 수(i+1)보다 큰 경우를 filter하면 배열이 나오는데 그 배열의 개수가 HIndex가 된다.

코드

첫 코드(전체 통과)
  1. h 이상 인용된 논문 개수를 구한 배열(counts)
  1. hIndex를 구한 배열(hIndex)
  1. Math.max로 인덱스 반환
      • 기존에는 sort로 내림차순 정렬해서 첫 번째 인덱스 반환했으나 더 느려서 수정
function solution(citations) { const n = citations.length // h 이상 인용된 논문 개수 구하기 // [3, 6, 5] 3 const counts = citations.map(h => { return citations.filter((citation) => citation >= h).length }) // hIndex 구하기 const hIndex = counts.map((count, i) => { return count <= citations[i] && (n - count) <= citations[i] ? count : 0 }) // 최댓값 반환 return Math.max(...hIndex) }
  • 테스트 결과
    • 역전된 순간에서 나머지 논문은 어차피 이하이므로 볼 필요가 없다.
    • hIndex.sort() 테스트 결과 (41.26ms, 38.3MB)
    • Math.max(…hIndex) 테스트 결과 (34.10ms, 36.7MB)
  • 밑줄 친 부분이 아직 이해가 안된다. 처음에 >=생각했다.
    • h번 이상 인용된 논문(count)이 h편 이상(citations[i])이고
  • 팀원과 코드 리뷰 후 문제 다시 이해
    • 정렬과 i+1을 비교해서 같거나 역전되는 순간이 최댓값이다. ❌ → 역전된 순간도 최댓값이 아니다. 이 것은 h가 3일 때 논문 수도 3일 때의 경우이고, [9, 5, 2, 1, 0]과 같을 때는 정답으로 2가 아니라 3이 나오므로 실패한다.
    • 역전된 순간에서 나머지 논문은 어차피 이하이므로 볼 필요가 없다. ⭕
두 번째 코드(전체 통과)
  • 팀원 분들의 코드를 보고 문제를 다시 이해했다.
    • 기존 코드와 다른 점: 내림차순 정렬, hIndex를 따로 구하지 않는다.
  • 테스트 케이스 추가: [3, 0, 6, 1, 5] 3 말고, h와 i+1이 숫자가 다른 경우를 체크하고 싶어서 추가했다.
// 인용된 수(h) : 65310 95210 // 논문의 수(i+1) : 12345 12345 // h >= i+1에 부합하는 h의 개수를 구하면 각각 [6, 5, 3] -> 3, [9, 5] -> 2가 나온다. function solution(citations) { // 내림차순 정렬 citations = citations.sort((a, b) => b - a) return citations.filter((citation, i) => citation >= i + 1).length }
 

정은


구현

 

코드

function solution(citations) { citations.sort((a,b) => b-a) for (let i=0; i<citations.length; i++) { if (citations[i] <= i+1) { return Math.max(citations[i], i) } } return citations.length }

종혁


구현

코드

function solution(citations) { //전체 길이가 h의 최댓값 let answer = 0; citations.sort((a,b)=>{ return b-a; }); const {length} = citations for(let i=0 ; i<length; i) { if(i<citations[i]) {//인용된 수가 현재 논문의 수보다 작아지면 끝 answer ++ ; } } return answer; } function solution(citations) { const length = citations.length //h 인용수 let result = 0 for(let h=0;h<=length;h++){ let 인용횟수 = 0 citations.forEach((copy,index)=>{ if(copy >= h){ 인용횟수 ++}}) let 안인용횟수 = length - 인용횟수 if(인용횟수 >= h && 안인용횟수 <= h){ result = h } } return result } 인용 인용X h 5 0 0 4 1 1 3 2 2 3 2 3 2 3 4 2 3 5

재웅


구현

 

코드

function solution(citations) { let answer = citations.length; for(answer;answer>=0;answer--){ const filter = citations.filter((el)=>el>=answer) if(filter.length>=answer) return answer } }
 

✏️ 후기

문제를 풀고 느낀 점, 막혔던 부분 혹은 개선 사항 등을 자유롭게 작성해주시면 됩니다.

👧🏻
수영
  • 문제 이해를 제대로 못해서 더 어렵게 접근했던 것 같다.
  • 팀원 분들의 코드가 문제를 이해하는 데 도움이 됐다.
👧🏻
정은
  • 테스트 한개는 눈치껏 맞추게 되었다(선 통과 후 이해)
👦🏻
종혁
  • 인용된 횟수들이 중요한게 아니라, 논문의 개수로 접근해야 되는것 같다
👦🏻
재웅