TIL/알고리즘 공부

프로그래머스 Lv. 2 Swift 알고리즘 - 귤 고르기

여의도사노비 2023. 1. 9. 18:29
728x90

예전에 백준 문제 풀때 enumerated를 한 번 써봤는데...

너무 오랜만에 쓰는거라 여기저기 블로그 참고를 하여 활용하였다.

 

문제 자체는 간단하다! 제일 빈도수 높게 나온 원소를 우선으로 K개 만큼 골라주면 된다.

이 과정에서 딕셔너리, enumerated 등이 사용된다. (물론 enumerated 안써도 구할 수 있다.)

 

 

 

이 문제를 풀면서 생각한 논리적 흐름

  1. tangerine 배열에 주어진 값들을 dict에 key별로 카운트한다.
  2. 다음으로 dict 배열을 value 값이 큰 순서대로 정렬해주고
  3. 순서대로 k개 만큼 값을 빼준다.
  4. 그 과정에서 한 번 과정이 진행될때마다 index값을 옮기고
  5. 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)

  1. 처음 문제를 풀 때 enumerated 대신 idx를 직접 만들어 사용했다. 하지만 막상 사용하니 애매한 오차가 존재해 몇가지 케이스들이 맞지 않는 불상사가 발생했다! 확실히 enumerated를 사용하니 좀 더 명확하게 값의 index, value를 다룰 수 있었다. 이래서 enumerated를 쓰는구나 싶다.