본문 바로가기
프로그래머스 Algorithm

[프로그래머스] H-Index Kotlin

by Echung 2024. 1. 13.

thumbnail

안녕하세요. 이번에는 프로그래머스 H-Index 문제를 풀어보려고 합니다. 

Problem


https://school.programmers.co.kr/learn/courses/30/lessons/42747

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

Solution


class Solution {
    fun solution(citations: IntArray): Int {
        val sortedCitations = citations.sorted()
        var max = 0

        for(i in sortedCitations.size - 1 downTo 0) {
            val min = Math.min(sortedCitations[i], sortedCitations.size - i)
            max = Math.max(min, max)
        }

        return max
    }
}

 이번 문제는 n 편 중, h번 이상 인용된 논문이 h 편 이상이고 나머지 논문이 h번 이하 인용되었다면 h의 최댓값이 과학자의 H-Index라고 합니다. 그래서 먼저 h번 이상 인용된 논문을 구해야 하기 때문에 sorted 기능을 통해서 정렬을 해줬습니다.

이렇게 정렬을 하게되면 [0, 1, 3 ,5 ,6]이 됩니다. 여기서 각 값과 그 값 이상이 등장하는 횟수를 표시하면 다음과 같습니다.

  • 6 : 1번 
  • 5 : 2번
  • 3 : 3번
  • 1 : 4번
  • 0 : 5번

이때, H-Index는 3이 됩니다. 왜냐하면 3번 이상 등장하는 값이 3개 있고, 그중 최댓값이 3이기 때문입니다.

이것을 코드로 만들게되면, Math.min()을 통해서 인용된 횟수와 인용된 논문의 편수 중 낮은 값을 구합니다

그리고 그 Math.max()를 사용하여 min 값 중 최댓값을 구해주면 H-index의 값을 구할 수 있습니다. 

1. 다른 사람 코드

import kotlin.math.min

class Solution {
    fun solution(citations: IntArray) = 
    citations.sortedDescending().mapIndexed { 
        idx, item -> 
        min(idx + 1, item) 
    }.maxOf { it }
}

 저와 비슷한 방법으로 문제를 풀었지만 mapIndexed를 사용해서 좀 더 코드에 가독성이 좋아 보여서 가져왔습니다.


Performance

1. 내가 작성한 코드 2. 다른 사람 코드
반응형