프로그래머스- 45

김정현·2023년 6월 17일
0

프로그래머스

목록 보기
45/46

미지수를 대입해서 말장난을 쳐놓은듯한 문제다.

citations	       return
[3, 0, 6, 1, 5]	      3

이런식인데, 논문의 갯수는 citations.count이고 h번 이상 인용되었으며(3,6,5) h편(3) 이상이고 나머지(0,1) 논문이 h편 이하로 인용 됐을때, h 를 구하라는 것이다.

이걸 어떤 구조던간에 모든 경우의수를 관통할 알고리즘을 세워야하는데, 그러기 위해 단계를 나눠 차례로 if문을 사용하는 느낌으로 해결하기로 했다.

1. h편의 논문은 h편이상 인용되었다.

import Foundation

func solution(_ citations:[Int]) -> Int {
    var Citations = citations
    for i in Citations{
       if i <= Citations.filter({ $0 >= i }).count {
           
       }
    }
}

엄청 헷갈린다. 우선 citations가 상수이기때문에 변수로 선언해준 후, for문으로 모든 원소에 첫번째 조건을 입력했다.

2. 나머지 논문이 h편 이하로 인용됐다.

if citations.count - Citations.filter({ $0 >= i }).count >= i {
               HIndexarr.append(i) 
           }

filter 카운트 값을 따로 선언해도 깔끔할것 같지만 알고리즘은 조금이라도 양을 줄이는게 목적이니 따로 선언은 하지 않았다.
우선, 최댓값이 H-Index지만 구하기 앞서 모든 i값을 미리 선언해둔 빈 배열에 추가했다.

3. 최댓값이 H-Index이다.

return HIndexarr.max() ?? 0

이렇게 처리하면 답이 깔끔하게 나올줄 알았는데.. 답이 틀렸다. 그래도 오류가 발생하지 않은건 다행이다.

정말 다행히도

if citations.count - Citations.filter({ $0 >= i }).count <= i 

부등식만 하나 바꾸니 테스트 케이스 하나는 통과했는데

두개맞고 전멸해버렸다. 이건 어디가 아예 틀렸다는건데..

우선 따로 변수선언이 필요없는거 같아서 그 부분을 삭제했다.

import Foundation

func solution(_ citations:[Int]) -> Int {
    var HIndexarr: [Int] = []
    for i in citations{
       if i <= citations.filter({ $0 >= i }).count {
           if citations.count - citations.filter({ $0 >= i }).count <= i {
               HIndexarr.append(i) 
           }
       }
    }
    return HIndexarr.max() ?? 0
}

여기서 뭐가 문제일까
도저히 잘 모르겠어서 필터 부분에서 오류라 생각하고, 방법을 살짝만 바꾸기로 했다. 어차피 h가 구조적으로 count의 갯수를 넘길 수가 없기 때문에 그것을 이용하여 for 문을 살짝 바꿨다. 그리고 보기 편하게 하기위해 필터 구절도 변수로 변경했다.

import Foundation

func solution(_ citations:[Int]) -> Int {
    var HIndexarr: [Int] = []
    for i in 0...citations.count-1{
        var m = citations.filter({ $0 >= i }).count
       if i <= m {
           if citations.count - m <= i {
               HIndexarr.append(i) 
           }
       }
    }
    return HIndexarr.max() ?? 0
}

딱 1문제만 틀렸다. 엣지케이스에서 틀린듯하다. 정말 징하게도 안풀린다.

마지막으로 -1을 제거해서 정답 처리를 받았다. 인덱스개념이 아닌 모든 것이 갯수의 요소이기때문에 1...으로 바꿀지언정 마지막을 저렇게 하면 안됐다.

다른사람의 풀이로는

import Foundation

func solution(_ citations:[Int]) -> Int {
    for (index, cit) in citations.sorted(by: >).enumerated() {
        if index >= cit {
            return index
        }
    }
    return citations.count
}

이런 고수의 풀이도 있었다.

for (index, value) in array.enumerated() {
    print("Index: \(index), Value: \(value)")
}

이런식으로 인덱스를 키, 벨류를 값으로 쌍으로 저장할 수 있어 인덱스와 해당값이 모두 필요할때 유용하게 사용할 수 있을 거 같다.

0개의 댓글