알고리즘/프로그래머스

[프로그래머스/Swift] 귤 고르기

녕이 2023. 1. 3. 17:16
728x90

 

https://school.programmers.co.kr/learn/courses/30/lessons/138476

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

우선 딕셔너리에 귤 크기에 따른 개수를 넣어줬다 [귤 크기: 개수]

그리고 정렬해준 다음에 개수가 많은 귤부터 상자에 넣어줬다. 그래야 귤의 종류가 적어질 수 있으니까!

사실 시간초과가 조금 걱정되었지만 100,000이라 설마~ 하면서 일단 작성했다. 

아리까리하다면 해보는 게 답이지!^^ 빠르게 구현해볼 수 있을 거 같아서 도전했다.

 

처음엔 문제를 잘못 이해해서 틀렸다. 뭐가 문제였냐면~

한 종류의 귤을 다 넣어야 하는줄 알았다!! 어쩜 이런 생각을....

첫 제출때 시간초과는 없길래 휴.. 이런 식으로 해도 되는구나~^_^

 

어쨌든 (상자에 들어간 귤의 개수 + 현재 귤의 개수의 값)이 k보다 크거나 같다면 answer += 1해 주고 끝냈다.

이 귤까지는 넣을 수 잇으므로~

 

아쉽게 배열의 원소의 개수를 value로 dictionary에 바로 넣으면서 바로 정렬하는 방식을 본 적이 있었는데

생각이 안 나서 그냥 쭉 코드를 작성했다. 이제 제출 성공했으니 다른 사람 코드를 확인해 봐야겠다!

 

[내 코드]

import Foundation

/*
 수확한 귤 중 k개를 골라 상자에 담아 판매하려고 한다.
 귤을 크기별로 분류했을 때, 서로 다른 종류의 수를 최소화하고 싶다.
 귤의 종류의 수 최솟값은?
 */

func solution(_ k:Int, _ tangerine:[Int]) -> Int {
    var answer = 0
    var sum = 0
    var dictionary = [Int:Int]()
    for tan in tangerine {
        dictionary[tan] = (dictionary[tan] ?? 0) + 1
    }
    let sortedDictionary = dictionary.sorted { t1, t2 in
        return t1.value > t2.value
    }
    
    for tangerine in sortedDictionary {
        if tangerine.value + sum >= k {
            answer += 1
            break
        }
        sum += tangerine.value
        answer += 1
    }
    return answer
}

 


 

그런데 개인적으로 너무너무 많이 축약한 코드는 별로 안 좋아한다.. 실제 현직자들께서는 어떻게 생각하는지 모르겠지만...

오히려 헷갈려서 적당히 축약한 코드가 다른 사람들이 읽기도 좋다고 생각한다..^^..

 

func solution(_ k:Int, _ tangerine:[Int]) -> Int {
    var answer = 0
    var sum = 0
    var dictionary = [Int:Int]()
    tangerine.forEach { dictionary[$0] = (dictionary[$0] ?? 0) + 1 }

    for tangerine in dictionary.sorted { return $0.value > $1.value } {
        sum += tangerine.value
        answer += 1
        if sum >= k { break }
    }
    return answer
}

이렇게 코드를 리팩터링 해봤다! tangerine은 $0, $1을 사용해서 좀 더 간결하게 바꾸고,

sort 부분은 따로 상수/변수에 할당하지 않고 바로  for - in 문에서 사용하도록 했다. 그리고 for-in 문 내부의 코드도 정리해 줬다.

다시 보니 굳이 if문이 위에서 먼저 체크할 필요가 없다는 생각이 들었다. 중복코드라고 생각했다!

 

여기서 배열 값을 dictionary로 바꿔주는 부분에서 어떤 분은 이렇게 구현하셨다.

tangerine.forEach { map[$0, default: 0] += 1 }

default parameter가 있는지 몰랐다..!!!!!!@! default 부분에 key의 value값이 nil이면 0을 넣어주는 것 같다!

정말 놀라운 발견...

 

사실 아직 Apple Developer Document에서 Array 부분을 공부&정리하는 중이라서 Dictionary 부분은 아직 하지 못했는데

그래서 몰랐던 것 같다. 빨리 dictionary 부분도 공부하고 싶다! 

재미있군...

 

 

 

 

728x90