반응형
문제
https://programmers.co.kr/learn/courses/30/lessons/72411
풀이
import Foundation
func solution(_ orders:[String], _ course:[Int]) -> [String] {
var result = [String]()
for n in course {
var temp = [String:Int]()
var check = true
orders.forEach { order in
combination(order, n).forEach {
temp[$0, default: 0] += 1
if temp[$0]! >= 2 {
check = false
}
}
}
if check { continue }
let sortedTemp = temp.sorted(by: { $0.value > $1.value })
let limit = sortedTemp[0].value
for (key, value) in sortedTemp {
if value == limit{
result.append(key)
} else {
break
}
}
}
return result.sorted()
}
func combination(_ str: String, _ n: Int) -> [String] {
var result = [String]()
if str.count < n {
return result
}
var sa = Array(str).map { String($0) }
var stack = [(String, Int)]()
for i in 0..<str.count {
stack.append((sa[i],i))
}
while stack.count > 0 {
let now = stack.removeLast()
let nowString = now.0
let nowIdx = now.1
if nowString.count == n {
result.append(String(nowString.sorted()))
continue
}
guard nowIdx+1 <= sa.count-1 else { continue }
for i in nowIdx+1...sa.count-1 {
stack.append((nowString + sa[i], i))
}
}
return result
}
- 어렵지 않은 문제였지만, Swift에서 조합을 사용하는 것이 익숙치않아 포스팅해놓습니다.
- 가능한 조합의 케이스를 모두 확인하여 return하는 함수를 짜놓고 이를 활용하는 방식으로 해결했습니다.
- combination을 Generic하게 구현해놓고 필요할때마다 사용하는 것도 좋은 전략이 될 것 같습니다.
반응형
'💻 CS > 알고리즘 연습' 카테고리의 다른 글
[알고리즘 연습] 방금그곡 (프로그래머스 lv2, 스위프트) (0) | 2022.04.23 |
---|---|
[알고리즘 연습] 다리를 지나는 트럭 (프로그래머스 lv2, 스위프트) (0) | 2022.03.17 |
[알고리즘 연습] 양궁대회 (프로그래머스 lv2, 스위프트) (0) | 2022.02.22 |
[알고리즘 연습] 조이스틱 (프로그래머스 lv2, 스위프트) (1) | 2022.02.17 |
[알고리즘 연습] 행렬 테두리 회전하기 (프로그래머스 lv2, 스위프트) (0) | 2022.02.13 |