본문 바로가기
Problem Solving

[Swift] 프로그래머스 H-Index(lv. 2)

by DuncanKim 2023. 3. 16.
728x90

[Swift] 프로그래머스 H-Index(lv. 2)

 

1. 문제

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

 

프로그래머스

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

programmers.co.kr

 

2. 접근

 

논문이 인용된 횟수가 주어지는데, 이것을 가지고 'N번 인용된 논문의 개수'를 세고, N회 이상 인용된 논문의 수를 세야 한다.

그렇다면 계수를 활용해서 정렬을 하는 '계수정렬'을 사용하면 될 것이다.

 

0번 인용된 논문의 수 / 1번 인용된 논문의 수 / 2번 인용된 논문의 수 / 3번 인용된 논문의 수 / .....

 

이렇게 배열이 주어지는 것이다. 배열 안의 인덱스를 활용하면 N번 인용된 논문의 수를 셀 수 있다.

 

아래 코드의 array는 citations의 최대값(예시에서는 6)만큼 크기를 가지는 array를 만들었다. 

그런 다음, i를 활용해서 array[i]에 +1을 해주는 방식으로 논문의 수를 count 해준다.

 

그런 다음, h의 최대값을 찾아준다.

array를 0부터가 아니라 끝부터 내려오면서 반복하는데,

tempSum은 논문의 개수를 누적하여 더하는 변수이다. 그렇다면, i는 array.count - 1부터 내려오면서 0까지 가는데, 논문의 개수 합이 i보다 더 커지는 때가 올 것이다. 이것이 h번 이상 인용된 논문이 h편 이상인 때를 알려준다고 할 수 있다. 그 때 i를 리턴해주면 되는 것이다.

 

정렬 후 최대값을 찾아주는 정렬 문제였다.

 

3. 코드

import Foundation

func solution(_ citations:[Int]) -> Int {
    // 계수 정렬
    var array = [Int](repeating: 0, count: citations.max()! + 1)
    for i in citations {
        array[i] += 1
    }
    var tempSum = 0
    for i in stride(from: array.count - 1, to: 0, by: -1) {
        tempSum += array[i]
        if tempSum >= i {
            return i
        }
    }
    return 0
}
728x90

댓글