문제 설명
- H-index, 논문h번이상 인용된 논문이 h편이상일 때 그것의 최대치
- 예를들어 3이상 인용된게 3개이상이면 3, 4이상 4개이상이면 4 이런식으로해서 최대치구하기
문제접근
- Hindex가 될 수 있는 후보군을 standard로 지명하고
- 이제 그 기준보다 큰거를 카운팅해줘서 개수 비교 후 배열에 넣어주고 그곳에서 max값 출력하는 방식으로 짜보려 했다.
제출 코드
import Foundation
func solution(_ citations: [Int]) -> Int {
var answer: [Int] = []
for item in citations {
let standard = item
var count = 0
for i in citations {
if standard >= i {
count += 1
}
}
if count >= standard {
answer.append(standard)
}
}
return answer.max() ?? 0
}
채점 결과
정확성: 6.3
합계: 6.3 / 100.0
오잉 ? 한개 빼고 다틀렸다. 뭐가 문제지 ?
개선작업
반례를 찾아왔는데,
입력값 〉 [5, 6, 7, 8]
기댓값 〉 4
이게 4라고 한다. 5이상이 없으니까 0으로 출력하는 건지 알았는데,
4번보다 많이 인용되었다고 나오는거보니까 길이인가?길이를 기준으로 한 번 해봤다.
제출코드 _ 2
import Foundation
func solution(_ citations: [Int]) -> Int {
for i in Array(1 ... citations.count).reversed() {
var count = 0
for item in citations {
if item >= i {
count += 1
}
}
if i == count {
return count
}
}
return 0
}
채점 결과
정확성: 93.8
합계: 93.8 / 100.0
한개가 틀린걸 보니까 극단적인 예시 하나 정도가 어긋난 것 같다.
citations = [6, 5, 3, 3, 0]
기대값 = 3
3보다 큰게 4개인데, 이거
if i == count {
return count
}
이렇게 되어있어서 0을 반환하고 있었다. 이 부분을 수정했다.
if i <= count {
return i
}
return count
도 이제 어처피 같으니까 했었는데, 길이값으로 해주고 있으니까 return i
로 수정!
최종코드
import Foundation
func solution(_ citations: [Int]) -> Int {
for i in Array(1 ... citations.count).reversed() {
var count = 0
for item in citations {
if item >= i {
count += 1
}
}
if i <= count {
return i
}
}
return 0
}
채점 결과
정확성: 100.0
합계: 100.0 / 100.0
타인의 코드
import Foundation
func solution(_ citations:[Int]) -> Int {
let citations = citations.sorted() { $0 > $1 }
var result = 0
for i in 0..<citations.count {
if i + 1 <= citations[i] {
result = i + 1
} else {
break
}
}
return result
}
- 거의 동일한 코드였는데, else로 바로 뛰쳐나와도 문제없게끔 sort > 를 해줘서 내림차순 정렬을 해준다음에 작은길이부터 탐색을 해줬다.
- 나는 반대로 길이 탐색 자체를 큰 수부터 해줬으니, 그 정도 차이가 있는 것 같다.