본문 바로가기

Algorithm/프로그래머스

정렬 - H-index

반응형

정렬 - H-index(programmers.co.kr/learn/courses/30/lessons/42747?language=kotlin)를 풀어봤다.

 

풀이는 아래와 같다.

 

    fun solution(citations: IntArray): Int {
        citations.sortedDescending().forEachIndexed { index, i ->
            if (index >= i) {
                return index
            }
        }

        return citations.size
    }

 

처음엔 문제가 이해가 안갔다... 최초 풀이는 아래와 같다

        var answer = 0

        for (i in citations.indices) {
            val h_index = citations[i]
            var upCount = 0
            var downCount = 0
            for (j in citations.indices) {
                if (h_index <= citations[j]) {
                    upCount ++
                } else {
                    downCount ++
                }
            }
            
            if (upCount == h_index && downCount <= h_index) {
                answer = h_index
                return answer
            }
        }

        return answer

왜 이렇게 생각했냐면, 예제인 {3, 0, 6, 1, 5} 를 5개의 논문을 각각 3번, 0번 6번, 1번, 5번 인용했고, 3번 이상 인용한 사람은 3개의 논문이며, 3번 이하 인용한 논문은 2개이다. 라고 생각했다.

하지만 이걸 토대로 돌리면 다 틀린다. 16번은 맞았다. 왤까....?

 

그래서 위키를 읽어봤다.

역시 영어는 어렵다. 구글링 했다...............

 

문제 이해부터 틀렸다. 문제는 "x번 인용한 논문이 x번 이상일 경우"를 생각하면 된다. 즉, 각 논문당 몇번을 이용하던, 몇번의 인용이 몇개인지가 중요하다. 예를 들어, [10, 100], 즉, 2개의 논문, 10번, 100번의 인용이 있다고 치자. 이것의 답은 무엇일까?

 

답인 h_index 는 10? 100? 아니다 2다.

 

왜 2일까? 생각해보면, 10번, 100번의 인용은 모두 2번이상을 인용했으며, 2개의 "이상"의 논문이다. 즉, h_index = 2가 된다.

 

그렇다면, [2, 2, 2]는? 생각해봐라.(답은 맨 밑에서...)

 

여튼 그렇다. 다시 계산을 했다. 내림차순으로 정렬해 [10, 100] 이라면 [100, 10]으로 바꾸기 위해 sortedsortedDescending() 을 사용했다. 또한, 위의 예제대로, 굳이 몇 번의 인용을 했느냐를 어레이에서 찾는게 아닌, 인덱스로 눈을 돌렸다. 이게 포인트다. "몇 번 이상"의 인용을 위해 index가 array 안에 담겨 있는 숫자보다 "크거나 같다면(=이상)" 해당 인덱스 이상을 이용한게 되므로, 바로 return해준다. 

 

여기서 끝이 아니다. index가 array에 담긴 수 이상임을 찾기 전에 for문이 끝이난다면, 어떻게 해야할까?

답은 해당 어레이의 크기를 리턴해주면 된다. 왜냐고? 논문의 갯수 이상을 인용할 수 없으니까!

 

 

 

 

 

 

 

답은 2다!

 

내가 사용한 예제는 다음과 같다.

        val citations00 = intArrayOf(3, 0, 6, 1, 5) 
        val citations01 = intArrayOf(10, 8, 5, 4, 3) 
        val citations02 = intArrayOf(4, 4, 4, 4, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6)
        val citations03 = intArrayOf(10, 50, 100)
        val citations04 = intArrayOf(2, 2, 2)
        val citations05 = intArrayOf(10, 100)
        println("3 = "+Level2_H_index(citations00))
        println("4 = "+Level2_H_index(citations01))
        println("6 = "+Level2_H_index(citations02))
        println("3 = "+Level2_H_index(citations03))
        println("2 = "+Level2_H_index(citations04))
        println("2 = "+Level2_H_index(citations05))
반응형

'Algorithm > 프로그래머스' 카테고리의 다른 글

완전탐색 - 카펫  (0) 2021.02.04
완전탐색 - 모의고사  (0) 2021.01.28
정렬 - 가장 큰 수  (0) 2021.01.12
정렬 - K번째 수  (0) 2021.01.12
해시 - 완주하지 못한 선수  (0) 2020.12.30