TIL/알고리즘 공부
프로그래머스 Lv. 2 Swift 알고리즘 - 귤 고르기
여의도사노비
2023. 1. 9. 18:29
728x90
예전에 백준 문제 풀때 enumerated를 한 번 써봤는데...
너무 오랜만에 쓰는거라 여기저기 블로그 참고를 하여 활용하였다.
문제 자체는 간단하다! 제일 빈도수 높게 나온 원소를 우선으로 K개 만큼 골라주면 된다.
이 과정에서 딕셔너리, enumerated 등이 사용된다. (물론 enumerated 안써도 구할 수 있다.)
이 문제를 풀면서 생각한 논리적 흐름
- tangerine 배열에 주어진 값들을 dict에 key별로 카운트한다.
- 다음으로 dict 배열을 value 값이 큰 순서대로 정렬해주고
- 순서대로 k개 만큼 값을 빼준다.
- 그 과정에서 한 번 과정이 진행될때마다 index값을 옮기고
- value + number가 k보다 큰 시점에 index값에 1을 더하여 서로 다른 무게를 가진 원소가 몇 개인지 확인한다.
* 코드
import Foundation
func solution(_ k:Int, _ tangerine:[Int]) -> Int {
var dict: [Int: Int] = [:]
var value: Int = 0
var ans: Int = 0
for i in tangerine {
let key = dict[i] ?? 0
dict[i] = key + 1
}
let sortedDict = dict.values.sorted(by: >)
for (index, number) in sortedDict.enumerated() {
if value + number >= k {
ans = index + 1
break
} else {
value += number
}
}
return ans
}
정리(Today I Learned)
- 처음 문제를 풀 때 enumerated 대신 idx를 직접 만들어 사용했다. 하지만 막상 사용하니 애매한 오차가 존재해 몇가지 케이스들이 맞지 않는 불상사가 발생했다! 확실히 enumerated를 사용하니 좀 더 명확하게 값의 index, value를 다룰 수 있었다. 이래서 enumerated를 쓰는구나 싶다.