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

YoungHyun Kim·2023년 12월 21일
1

매일매일 알고리즘

목록 보기
27/30

문제

경화는 과수원에서 귤을 수확했습니다. 경화는 수확한 귤 중 k개를 골라 상자 하나에 담아 판매하려고 합니다. 그런데 수확한 귤의 크기가 일정하지 않아 보기에 좋지 않다고 생각한 경화는 귤을 크기별로 분류했을 때 서로 다른 종류의 수를 최소화하고 싶습니다.

예를 들어, 경화가 수확한 귤 8개의 크기가 [1, 3, 2, 5, 4, 5, 2, 3] 이라고 합시다. 경화가 귤 6개를 판매하고 싶다면, 크기가 1, 4인 귤을 제외한 여섯 개의 귤을 상자에 담으면, 귤의 크기의 종류가 2, 3, 5로 총 3가지가 되며 이때가 서로 다른 종류가 최소일 때입니다.

경화가 한 상자에 담으려는 귤의 개수 k와 귤의 크기를 담은 배열 tangerine이 매개변수로 주어집니다. 경화가 귤 k개를 고를 때 크기가 서로 다른 종류의 수의 최솟값을 return 하도록 solution 함수를 작성해주세요.

제한사항

  • 1 ≤ k ≤ tangerine의 길이 ≤ 100,000
  • 1 ≤ tangerine의 원소 ≤ 10,000,000

풀이

  1. 주어진 귤의 크기를 정리한 배열에서, 귤의 갯수를 크기 별로 정리한다. (크기가 1인 귤 : x개...)(추후에 귤의 크기에 따른 rank 변수의 정리를 위해서 진행)
  2. 귤의 크기가 몇 종류인지 Set 자료형을 이용해서 정리한다. (지금부터 귤의 크기가 몇인지는 중요하지 않음.)
  3. 귤의 크기가 제일 작은 종류부터 갯수를 정리한다. (temp, rank 변수를 정의한 이유)
  4. k 개를 고를 때 크기가 서로 다른 종류의 수가 최소가 되게 하려면 갯수가 가장 많은 크기의 귤을 골라야한다. 3의 과정에서 정리한 배열을 arr.sorted(by: >) 를 통해서 정리한다.
  5. 제일 큰 arr의 원소부터 k와 비교하며 arr의 원소들의 합이 k보다 같거나 커질 때까지 비교하는 작업을 반복한다. arr의 원소를 더할 때마다, result 정수형 변수를 1씩 증가시킨다.
import Foundation

// 담으려는 귤의 갯수 : k
func solution(_ k:Int, _ tangerine:[Int]) -> Int {
    var sortedTangerine = tangerine.sorted(by: <), tangerineSet = Set<Int>(), arr = [Int](), sale = 0, result = 0
    
    // 귤 크기 순서에 따라 귤 갯수를 정리하기 위한 변수
    var rank = 0, temp = sortedTangerine[0]
    
    // 귤의 크기의 종류를 정리함
    for tan in sortedTangerine {
        tangerineSet.insert(tan)
    }
    
    // 귤의 크기 종류에 따른 갯수를 정리할 배열 선언
    for _ in 0..<tangerineSet.count {
        arr.append(0)
    }
    
    // 정렬된 귤 배열의 원소마다, 
    for tan in sortedTangerine {
        if temp == tan {
            arr[rank] += 1
        } else {
            temp = tan
            rank += 1
            arr[rank] += 1
        }
    }
    
    arr = arr.sorted(by: >)
    
    // 풀이 5번에서 정리된 작업을 수행하는 구문
    for a in arr {
        sale += a
        result += 1
        if sale >= k {
            break
        }
    }
    return result
}

회고

다 풀어낸 다음에 생각해보니, Dictionary 자료형을 사용한다면 더 수월하게 풀었을 것 같다는 생각이 들었다.

반복문으로 꾸역꾸역 풀어낸 것이 진짜...

딕셔너리를 사용해서 풀어보기도 해야겠다.는 생각이 들었다.

profile
iOS 개발자가 되고 싶어요

0개의 댓글