경화는 과수원에서 귤을 수확했습니다. 경화는 수확한 귤 중 k
개를 골라 상자 하나에 담아 판매하려고 합니다. 그런데 수확한 귤의 크기가 일정하지 않아 보기에 좋지 않다고 생각한 경화는 귤을 크기별로 분류했을 때 서로 다른 종류의 수를 최소화하고 싶습니다.
예를 들어, 경화가 수확한 귤 8개의 크기가 [1, 3, 2, 5, 4, 5, 2, 3] 이라고 합시다. 경화가 귤 6개를 판매하고 싶다면, 크기가 1, 4인 귤을 제외한 여섯 개의 귤을 상자에 담으면, 귤의 크기의 종류가 2, 3, 5로 총 3가지가 되며 이때가 서로 다른 종류가 최소일 때입니다.
경화가 한 상자에 담으려는 귤의 개수 k
와 귤의 크기를 담은 배열 tangerine
이 매개변수로 주어집니다. 경화가 귤 k
개를 고를 때 크기가 서로 다른 종류의 수의 최솟값을 return
하도록 solution
함수를 작성해주세요.
- 주어진 귤의 크기를 정리한 배열에서, 귤의 갯수를 크기 별로 정리한다. (크기가 1인 귤 : x개...)(추후에 귤의 크기에 따른
rank
변수의 정리를 위해서 진행)- 귤의 크기가 몇 종류인지
Set
자료형을 이용해서 정리한다. (지금부터 귤의 크기가 몇인지는 중요하지 않음.)- 귤의 크기가 제일 작은 종류부터 갯수를 정리한다. (
temp
,rank
변수를 정의한 이유)- 귤
k
개를 고를 때 크기가 서로 다른 종류의 수가 최소가 되게 하려면 갯수가 가장 많은 크기의 귤을 골라야한다.3
의 과정에서 정리한 배열을arr.sorted(by: >)
를 통해서 정리한다.- 제일 큰
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
자료형을 사용한다면 더 수월하게 풀었을 것 같다는 생각이 들었다.
반복문으로 꾸역꾸역 풀어낸 것이 진짜...
딕셔너리를 사용해서 풀어보기도 해야겠다.는 생각이 들었다.