이거 조합 문제라는 느낌이 바로 왔다.
그럼 DFS가 생각나는데, 너무 막막했다...^^... swift로 dfs요?
일단 치킨집이랑 집 위치 구하는거까지는 코드구현을 했다..^^
나머지 중요한 풀이쪽은 swift 문법을 좀 더 배우고 나서..
import Foundation
let input = readLine()!.split(separator: " ").map{Int(String($0))!}
let n = input[0]
let m = input[1]
var city: [[Int]] = Array(repeating: Array(repeating: 0,count:n ), count: n)
var house: [(r: Int, c: Int)] = []
var chicken: [(r: Int, c: Int)] = []
for i in 0..<n{
let line = readLine()!.split(separator: " ").map{Int(String($0))!}
for j in 0..<n where line[j] == 1 || line[j] == 2{
if line[j] == 1{
house += [(r: i, c: j)]
}else{
chicken += [(r: i, c: j)]
}
}
}
var chickenDis: [[Int]] = Array(repeating: Array(repeating: 0,count:house.count), count: chicken.count)
for i in 0..<chicken.count{
for j in 0..<house.count{
chickenDis[i][j] = abs(chicken[i].r - house[j].r) + abs(chicken[i].c - house[j].c)
}
}
어제 치킨배달을 못풀고 오늘 다시 해본다.
일단 튜플은 Hashable이 아니라서 스택 등에서 못쓰는것? 같았다. (아직 Hashable을 안배워서 모름)
그래서 r,c 를 node라는 구조체로 변경했다.
일단 생각해야할게,
import Foundation
var selectedChicken = [[Int]]()
func DFS(_ list:[Int],_ n:Int,_ r:Int,_ idx:Int,_ selected: inout [Int]) -> Void{
if(r == 0){
selectedChicken.append(selected)
return
}
for i in idx..<n{
selected.append(i)
DFS(list, n, r-1, i+1, &selected)
selected.removeLast();
}
}
struct node{
var r: Int
var c: Int
}
let input = readLine()!.split(separator: " ").map{Int(String($0))!}
let n = input[0]
let m = input[1]
var city = [[Int]]()
var house = [node]()
var chicken = [node]()
for i in 0..<n{
let line = readLine()!.split(separator: " ").map{Int(String($0))!}
for j in 0..<n where line[j] == 1 || line[j] == 2{
if line[j] == 1{
house += [node(r: i, c: j)]
}else{
chicken += [node(r: i, c: j)]
}
}
}
var list = Array<Int>()
for i in 0..<chicken.count{
list.append(i)
}
var selected = [Int]()
DFS(list, list.count, m, 0, &selected)
func dist(a:[node], b:[node])->Int{
var sum = 0
for i in a{
var distance = 1000
for j in b{
distance = min(distance, abs(i.r - j.r) + abs(i.c - j.c))
}
sum += distance
}
return sum
}
var result = 10000
for l in selectedChicken{
var s = [node]()
for i in l{
s.append(chicken[i])
}
result = min(result, dist(a: house, b: s))
}
print(result)
삽질한 보람이 있게 맞았다
dfs쪽만 코드를 참고하고 나머지는 직접 했다.
그래서 그런지 코드가 정말 안좋다...
좀 더 공부해서 간결한 코드를 쓸 수 있게되었음 한다.