[코딩테스트]프로그래머스 - H-Index

Adela·2020년 5월 5일
0

프로그래머스

목록 보기
4/30
post-thumbnail

처음에 문제를 제대로 이해하지 못해서 약간의 삽질을 했지만, 그래도 풀어냈다 !

H-Index

문제 설명

H-Index는 과학자의 생산성과 영향력을 나타내는 지표입니다. 어느 과학자의 H-Index를 나타내는 값인 h를 구하려고 합니다. 위키백과1에 따르면, H-Index는 다음과 같이 구합니다.
어떤 과학자가 발표한 논문 n편 중, h번 이상 인용된 논문이 h편 이상이고 나머지 논문이 h번 이하 인용되었다면 h의 최댓값이 이 과학자의 H-Index입니다.
어떤 과학자가 발표한 논문의 인용 횟수를 담은 배열 citations가 매개변수로 주어질 때, 이 과학자의 H-Index를 return 하도록 solution 함수를 작성해주세요.

제한사항

  • 과학자가 발표한 논문의 수는 1편 이상 1,000편 이하입니다.
  • 논문별 인용 횟수는 0회 이상 10,000회 이하입니다.

입출력 예

citations		return
[3, 0, 6, 1, 5]		3

입출력 예 설명

이 과학자가 발표한 논문의 수는 5편이고, 그중 3편의 논문은 3회 이상 인용되었습니다. 그리고 나머지 2편의 논문은 3회 이하 인용되었기 때문에 이 과학자의 H-Index는 3입니다.

참고: https://en.wikipedia.org/wiki/H-index (위키백과)

해결한 나의 코드

function solution(citations){
	var temp = []
    temp = citation(citations)
    if(temp == 0) return 0 // 논문 인용이 모두 0이면 0 반환 
    else return temp.i
}

function citation(citations){
	var citation_count = 0
    var temp = []
    if(citations.every(e => e === 0)){ // 논문이 모두 0이면 0 출력 
    	return 0 
    } else { // 모두 0인건 아닐 때 
    	citations = citations.sort((a,b) => {return a-b}) // 오름차순 정렬
        for(let i=1; i<=citations.length; i++){
        	citation_count = 0 // 초기화
            citations.map(e => {
            	if(e >= i){
                	citation_count++
                }
            })
            temp.push({i: i, count: citation_count})
           
        }
        temp = temp.filter((e) => e.i <= e.count)
        temp = temp.pop()
        return temp
    }
}

내가 생각한 알고리즘

  1. 먼저 citations의 갯수를 파악한다.
    1-1. ex. citations = [2,2,2,2]라면, 논문은 총 4편이다.
  2. 논문을 오름차순으로 정렬한다.
  3. 1회 ~ citations.length회 이상 인용된 논문이 몇개인지 확인한다.
    3-1. ex. citation = [2,2,2,2]라면, 모두 1회 이상 인용되었으므로 citation_count = 4
    3-2. 모두 2회 이상 인용되었으므로 citation_count = 4
    3-3. 3회 이상 인용된 논문이 없으므로 citation_count = 0
    3-4. 4회 이상 인용된 논문이 없으므로 citation_count = 0
    --> 따라서 h = 2 이다.

사실 문제를 제대로 이해하지 못해 이 부분 코드를 계속 잘못 짰다.
논문 인용수는 상관이 없었고, h의 최댓값은 citations.length라는 것이 중요한 포인트였다.
왜냐하면, h는 h회 이상 인용된 논문의 개수이기 때문이다. 아무리 아무리 커봤자 h는 전체 논문 개수밖에 안될 것이다.

  • 그래서 나는 citations.length만큼만 반복해서 계산했다.

하나 더 예를 들어보겠다.

3-1. ex. citations = [5,5,5,5]라면, 논문은 총 4편이고, 모두 1회 인용되었으므로 citation_count = 4
3-2. 모두 2회 인용되었으므로 citation_count = 4
3-3. 모두 3회 인용되었으므로 citation_count = 4
3-4. 모두 4회 인용되었으므로 citation_count = 4
3-5. 모두 5회 인용되었으므로 citation_count = 4 <-- 그러나 의미없다. 5회이상 인용된 논문이 5편일 수 없기 때문이다. 논문은 총 4편이다.
--> 따라서 h = 4 이다.

위와같은 과정을 거친 후

  1. 인용된 수가 citation_count를 넘지 않는 애들만 filter해주었다.
  2. (오름차순을 했기 때문에) 마지막에 있는 원소가 최댓값이 되므로, pop()해준다.
  3. 이를 반환한다.
  4. 그리고 solution()에서 h값, 즉 인용횟수를 반환한다.

이렇게 풀어나갔다. ㅎㅎㅎ 처음 봤을 땐 살짝 막막하게 느껴졌는데 결국 풀어서 뿌듯하다. 또 여기에 정리하면서 스스로 설명하기 어려운 부분도 생기는 걸 보니 확실하게 이해하지 못했던 것도 같다. 약간 때려맞춘게 맞았던 걸까.... 그래도 내 알고리즘이 틀리진 않은 것 같아 ㅠㅠ

다른 사람들 풀이는 역시.. 짧은 것들이 많다. 대단하다. 꾸준히 연습해서 나도 언젠가 그런 코드를 짜내고 싶다 !

profile
개발 공부하는 심리학도

0개의 댓글