슈프림 블로그
[프로그래머스] 정렬 - H-Index (Swift 풀이) 본문
어떤 과학자가 발표한 논문
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
}
'코딩테스트' 카테고리의 다른 글
[프로그래머스] 완전탐색 - 소수 찾기 (Swift 풀이) (0) | 2020.09.23 |
---|---|
[프로그래머스] 완전탐색 - 모의고사 (Swift / Java 풀이) (0) | 2020.09.23 |
[프로그래머스] 정렬 - K번째수 (Swift 풀이) (0) | 2020.09.20 |
[프로그래머스] 정렬 - 가장 큰 수 (Swift 풀이) (1) | 2020.09.19 |
[프로그래머스] 해시 - 베스트앨범 (Swift 풀이) (0) | 2020.09.11 |