프로그래머스 알고리즘 Level 2 H-Index 코틀린

2023. 3. 13. 21:56알고리즘/문제

H-Index

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

 

프로그래머스

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

programmers.co.kr

출처: 프로그래머스

(이 포스트는 광고 게시가 없는 비영리, 비상업적 포스트임을 알려드립니다.)

 

풀이

 

class Solution {
    fun solution(citations: IntArray): Int {
        var answer = 0
        val list = mutableListOf<Int>()
        for (i in citations.indices) {
            if (citations.count { it >= i + 1 } >= i + 1) list.add(i + 1)
        }
        answer = if (list.isEmpty()) 0 else list.last()
        return answer
    }
}

 

두 번 풀면서 느낀 점은 문제를 한 번에 이해하지 못했다는 것입니다.

 

 

[ 1,3,9,7,2,8,5,6,4,0 ]

위와 같은 예시가 있습니다.

 

h번 이상 인용된 논문이 h 편 이상이다는 말은

 

1(h) 번 이상 인용된 논문 =   9편  >=  1(h) 편 이상

2(h) 번 이상 인용된 논문 =   8편  >=  2(h) 편 이상

3(h) 번 이상 인용된 논문 =   7편  >=  3(h) 편 이상

4(h) 번 이상 인용된 논문 =   6편  >=  4(h) 편 이상

5(h) 번 이상 인용된 논문 =   5편  >=  5(h) 편 이상

6(h) 번 이상 인용된 논문 =   4편  <    6(h) 편 미만 

 

H-Index는 5입니다.

 

[ 9000,7000, 10000, 5000, 6000, 3000, 2000, 8000, 4000,  1000 ]

1번 이상 인용된 논문 = 10편 >= 1편 이상

2번 이상 인용된 논문 = 10편 >= 2편 이상

3번 이상 인용된 논문 = 10편 >= 3편 이상

4번 이상 인용된 논문 = 10편 >= 4편 이상

5번 이상 인용된 논문 = 10편 >= 5편 이상

6번 이상 인용된 논문 = 10편 >= 6편 이상

7번 이상 인용된 논문 = 10편 >= 7편 이상

8번 이상 인용된 논문 = 10편 >= 8편 이상

9번 이상 인용된 논문 = 10편 >= 9편 이상

10번 이상 인용된 논문 = 10편 >= 10편 이상

11번 이상 인용된 논문 = 10편 < 11편 미만

 

H-Index는 10입니다.

 

이해가 되시나요??

 

H-Index는 여러 개가 가능합니다. 1부터 다 1편 이상 2편 이상 만족하므로 전부 가능하다가

10편 일 때가 최대가 되기 때문에 10이 H-Index의 최댓값이 됩니다.

 

이제 다시 코드를 보겠습니다.

 

class Solution {
    fun solution(citations: IntArray): Int {
        var answer = 0
        val list = mutableListOf<Int>()
        for (i in citations.indices) {
            if (citations.count { it >= i + 1 } >= i + 1) list.add(i + 1)
        }
        answer = if (list.isEmpty()) 0 else list.last()
        return answer
    }
}

 

for문의 반복은 0번부터 citations의 size-1까지입니다.

돌아봐야 size 개수만큼 돌면 됩니다.

 

그리고 if문에 count를 세어주는데 

 

1번 이상 인용된 논문 = 10편 >= 1편 이상

2번 이상 인용된 논문 = 10편 >= 2편 이상

3번 이상 인용된 논문 = 10편 >= 3편 이상

4번 이상 인용된 논문 = 10편 >= 4편 이상

5번 이상 인용된 논문 = 10편 >= 5편 이상

6번 이상 인용된 논문 = 10편 >= 6편 이상

 

여기서 반복되는 게 보이시죠?? 

i+1번 이상 인용된 논문 = citation에서 i+1번 이상인 원소의 개수 >= i+1 이면 통과입니다.

그래서 if문 안에 

citation에서 i+1번 이상인 원소의 개수 >= i+1

citations.count { it >= i+1 } >= i+1 

 

이렇게 바뀌게 됩니다.

 

최적화는 몇 가지 있을 수 있습니다. 

저는 따로 하지 않고 1번 이상 인용된 걸 만족하지 않는다면 0이므로 마지막 분기 처리 후 반환하였습니다.

 

이상입니다. 감사합니다~