import Foundation
func solution(_ topping:[Int]) -> Int {
var ans = 0
var topping = topping
var toppingSet = Set<Int>()
var dict = [Int:Int]()
for (_,element) in topping.enumerated(){
if let count = dict[element] {
dict[element] = count + 1
} else {
dict[element] = 1
}
}
for (_,element) in topping.enumerated(){
toppingSet.insert(element)
dict[element]! -= 1
if dict[element]! == 0 {
dict[element] = nil
}
if toppingSet.count == dict.count {
ans += 1
}
}
return ans
}
import Foundation
func solution(_ x:Int, _ y:Int, _ n:Int) -> Int {
var ans = -1
func cal (_ x:Int, _ y:Int, _ n:Int, _ count : Int){
if x > y {
return
}
if x == y {
if ans == -1 {
ans = count
}else{
ans = min(ans,count)
}
return
}
cal(x+n,y,n,count+1)
cal(x*2,y,n,count+1)
cal(x*3,y,n,count+1)
}
cal(x,y,n,0)
return ans
}
솔직히 시간초과 날줄 알았다. 근데 뭔가 드디어 나도 DFS를 이해했구나 싶은 코드라서 소장용..
그래서 결국 문제를 어떻게 풀었냐면, 원래는 queue를 사용해서 BFS를 구현했지만, 이 또한 시간초과가 떠서, set를 이용하기로 했다.
BFS를 생각하면 결국 트리 모양이라고 할 수 있는데, 시작점에서 leafNode 별로 한 번에 전개하고, 그리고 다시 leafnode 별로 한번에 전개 하는 방식이다.
set 를 이용해서 x 부터 시작해서, x + n, x 2, x 3을 한번에 넣어주고, 다시 x + n, x 2, x 3 를 leafNode라고 생각하고 전개하는것이다. set를 쓰는것에 장점은, x + n == x * 2 이런 경우를 무시해줄수 있기 때문이다. 즉 연산을 한번 아낄수 있는것이다.
그리고 BFS이니깐 당연히 x + n, x 2, x 3 가 하나의 count로 계산할 수 있다.
import Foundation
func solution(_ x: Int, _ y: Int, _ n: Int) -> Int {
var count = 0
var set: Set<Int> = [x]
while !set.isEmpty{
if set.contains(y) {
return count
}
var tempSet : Set <Int> = []
for num in set {
if num + n <= y {
tempSet.insert(num + n)
}
if num * 2 <= y {
tempSet.insert(num * 2)
}
if num * 3 <= y {
tempSet.insert(num * 3)
}
}
set = tempSet
count += 1
}
return -1
}