우선 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
}
이건 꼭 기억해두자