Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
반응형
Archives
Today
Total
관리 메뉴

슈프림 블로그

[프로그래머스] 정렬 - H-Index (Swift 풀이) 본문

코딩테스트

[프로그래머스] 정렬 - H-Index (Swift 풀이)

_슈프림 2020. 9. 20. 23:10
728x90

어떤 과학자가 발표한 논문 n편 중, h번 이상 인용된 논문이 h편 이상이고 나머지 논문이 h번 이하 인용되었다면 h의 최댓값이 이 과학자의 H-Index입니다.

 

위의 문장이 문제 내용의 전부다.

h보다 큰 값이 h개 이상인 경우를 찾으면 된다.

 

어떻게 접근해야할까??

최대값을 찾아야 하므로 일단 citations를 내림차순으로 정렬하는 것이 편리할 것이다.

내림차순 정렬된 배열은 x보다 작은 인덱스에 위치한 값은 x번째 값보다 크다는 것을 이용하여,

h-1 인덱스의 값이 h 이상인지 판별하면 답을 얻어낼 수 있다. (= 적어도 0 ~ h-1 인덱스까지의 값들은 h 값 이상이라는 뜻)

 

실패 케이스

h를 점차 하나씩 줄여가면서 판단하면 되겠다는 생각으로, h의 초기값은 citations 값 중 최댓값으로 정했다.

즉, 내림차순 정렬된 배열의 첫번째 값부터 1까지 감소하는 반복문을 생성했다.

=> for h in (1...sorted\[0\]).reversed()

 

h-1 값은 배열의 크기보다 작아야 한다는 조건을 더해준다.

=> h-1 < sorted.count

 

내림차순이므로 0 ~ h-1 까지 (h개) 값이 h 이상인지 판단하는 것은 h-1 위치의 값만 판단하면 된다.

=> sorted\[h-1\] >= h

 

h는 큰 수부터 점점 작아지는 수이므로, 조건에 만족하면 바로 h를 리턴하면 최댓값을 리턴할 수 있다.

func solution(_ citations: [Int]) -> Int {
    var sorted = citations.sorted(by:>)
    for h in (1...sorted[0]).reversed() {
        if h-1 < sorted.count && sorted[h-1] >= h {
            return h
        }
    }
    return 0
}

하지만 맨 마지막 16번 케이스가 통과하지 않았다..

 

최종 성공 케이스

생각해보니,

h를 점차 하나씩 줄여가면서 판단하면 되겠다는 생각으로, h의 초기값은 citations 값 중 최댓값으로 정했다.

▲ 이부분에 오류가 있었다.

 

h보다 큰 값이 h개 이상 있어야 하므로, h는 배열 값 중 최대값이 아닌, 배열의 크기로 설정하면 된다.

그러면 자연스럽게 h-1가 배열의 크기보다 작아야 한다는 조건도 생략할 수 있다.

나머지 부분은 그대로 유지하고 실행해보니, 모든 케이스를 정상 통과하였다.

func solution(_ citations: [Int]) -> Int {
    var sorted = citations.sorted(by:>)
    for h in (1...sorted.count).reversed() {
        if sorted[h-1] >= h {
            return h
        }
    }
    return 0
}
반응형
Comments