프로그래머스- 41

김정현·2023년 6월 12일
0

프로그래머스

목록 보기
41/46

우선 return 값을 스위프트언어로는 아니더라도 수학적으로 표현할 수 있어야 하는데, 그것조차 쉽지 않았다. 우선 첫번 째로 생각한 것은 배열 속에 같은 숫자가 가장 많은 원소의 갯수를 n 이라 했을 때, k-n 을 하고 다시 위 과정을 반복해서 k =0 이 됐을때 작동이 멈추고 몇 번을 반복했는가를 세는 방식이었다.

그런데 코드로 구현하는것이 쉽지 않았다.
두번째 방법은 우선 같은 원소의 갯수를 세서 배열에 추가하고 오름차순으로 바꾼뒤 k-[0], k -[1] ... 이런식으로 진행한 뒤 이것이 몇번 이뤄졌는가? 를 판단하는 방법이다.

import Foundation

func solution(_ k:Int, _ tangerine:[Int]) -> Int {
    var DuplicationCount: [Int] = []
    var result = 0
    for i in tangerine {
        let count = tangerine.filter { $0 == i }.count
        DuplicationCount.append(count)
    }
    DuplicationCount.sort(by: >)
    for j in 0...DuplicationCount.count-1{
        var result = 0
        var n: Int = k
        n -= DuplicationCount[j]
        if n <= 0 {
            result += j+1
        }
    }
    return result
}

이건 코드로 작성하는게 어느정도 가능했다. 그러나 모든 실행값이 0이 나오며 실패했다.

import Foundation

func solution(_ k: Int, _ tangerine: [Int]) -> Int {
    var duplicationCount: [Int] = []
    var result = 0
    
    for i in tangerine {
        let count = tangerine.filter { $0 == i }.count
        duplicationCount.append(count)
    }
    duplicationCount.sort(by: >)
    
    var n = k
    for j in 0..<duplicationCount.count {
        n -= duplicationCount[j]
        if n <= 0 {
            result = j + 1
            break
        }
    }
    
    return result
}

result가 초기화되지 않게 맨 위로 올렸고, 0보다 같거나 작을때 반복문을 탈출하게끔 작성하였다. 테스트케이스는 통과했는데, 제출을 하면 실패했다. 아마도 첫번째 for문에 문제가 있는거 같다.
시간초과라는 문제를 해결할 수 없을거 같아 고민후 답안을 보았다.

func solution(_ k: Int, _ tangerine: [Int]) -> Int {
    var countDict: [Int: Int] = [:]
    
    for element in tangerine {
        countDict[element, default: 0] += 1
    }
    
    var n = k
    var result = 0
    
    for count in countDict.values.sorted(by: >) {
        n -= count
        result += 1
        
        if n <= 0 {
            break
        }
    }
    
    return result
}

이런식으로 훨씬 간단하게 축소 시켰다. 우선 딕셔너리를 사용하여 첫번째 for문을 확 줄였고, 두번째for문에서도 반복을 진행할때마다 +1을 해가며 양을 확 줄였다.

특히나 딕셔너리가 상당히 인상적이였는데,
element를 불러와 한번 부를때마다 키값에 +1을 해준다. 결과적으로는 [element: 갯수] 같은 형태로 남게되기 때문에 아주 유용하게 활용 가능할 것 같다.

for element in tangerine {
        countDict[element, default: 0] += 1
    }

이건 꼭 기억해두자

0개의 댓글