๋ฐฑ์ค€ - ์น˜ํ‚จ๋ฐฐ๋‹ฌ(Swift)

2022. 11. 18. 13:19ใ†Algorithm

๋ฐฑ์ค€ - ์น˜ํ‚จ๋ฐฐ๋‹ฌ(Swift)

 

 

 ๋ฌธ์ œ ์„ค๋ช…

 

https://www.acmicpc.net/problem/15686

 

15686๋ฒˆ: ์น˜ํ‚จ ๋ฐฐ๋‹ฌ

ํฌ๊ธฐ๊ฐ€ N×N์ธ ๋„์‹œ๊ฐ€ ์žˆ๋‹ค. ๋„์‹œ๋Š” 1×1ํฌ๊ธฐ์˜ ์นธ์œผ๋กœ ๋‚˜๋ˆ„์–ด์ ธ ์žˆ๋‹ค. ๋„์‹œ์˜ ๊ฐ ์นธ์€ ๋นˆ ์นธ, ์น˜ํ‚จ์ง‘, ์ง‘ ์ค‘ ํ•˜๋‚˜์ด๋‹ค. ๋„์‹œ์˜ ์นธ์€ (r, c)์™€ ๊ฐ™์€ ํ˜•ํƒœ๋กœ ๋‚˜ํƒ€๋‚ด๊ณ , rํ–‰ c์—ด ๋˜๋Š” ์œ„์—์„œ๋ถ€ํ„ฐ r๋ฒˆ์งธ ์นธ

www.acmicpc.net

 

 ๋‚˜์˜ ํ’€์ด

 

์ž…๋ ฅ์กฐ๊ฑด์ด ์ž‘์€ ๊ฒƒ์„ ๋ณด๊ณ  ์™„์ „ํƒ์ƒ‰์„ ์ƒ๊ฐํ–ˆ๊ณ  ์ด ๋•Œ๋ฌธ์— ์กฐํ•ฉ์„ ์ด์šฉํ•ด์„œ ๋ฌธ์ œ๋ฅผ ํ’€์—ˆ๋‹ค.

ํ•˜์ง€๋งŒ ๋ฌธ์ œ๋ฅผ ํ‘ธ๋Š”๋ฐ ์กฐ๊ธˆ ์˜ค๋ž˜๊ฑธ๋ ธ๋Š”๋ฐ ๊ทธ ์ด์œ ๊ฐ€ ์ง‘๋“ค์— ๋Œ€ํ•ด์„œ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ์น˜ํ‚จ์ง‘์„ ๊ตฌํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ ์น˜ํ‚จ์ง‘๋“ค์— ๋Œ€ํ•ด์„œ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ์ง‘์„ ์ฐพ์•˜๋˜ ๊ฒƒ์ด๋‹ค. ์ด ๋ฌธ์ œ๋Š” ๋ชจ๋“  ์ง‘์—์„œ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ์น˜ํ‚จ์ง‘๊นŒ์ง€์˜ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ•˜๋Š” ๊ฒƒ์ธ๋ฐ ๋ง์ด๋‹ค.

์ด ๋ถ€๋ถ„์„ ํ•ด๊ฒฐํ•˜๋‹ˆ ๋ฌธ์ œ๊ฐ€ ๋ฐ”๋กœ ํ’€๋ ธ๋‹ค.

 

import Foundation

let input = readLine()!.components(separatedBy:" ").map{Int($0)!}

let N = input[0], M = input[1]
var map = [[Int]]()
var chickens = [(Int, Int)]()
var houses = [(Int, Int)]()
var result = Int.max
for _ in 0..<N {
    let arr = readLine()!.components(separatedBy:" ").map{Int($0)!}
    map.append(arr)
}
for i in 0..<N {
    for j in 0..<N {
        if map[i][j] == 2 {
            chickens.append((i,j))
        } else if map[i][j] == 1 {
            houses.append((i,j))
        }
    }
}

let combinedChickens = combination(chickens, M)

for chicks in combinedChickens {
    var sum = 0
    for x in houses {
        var minVal = Int.max
        for y in chicks {
            minVal = min(minVal, distance(x,y))
        }
        sum += minVal
    }
    result = min(result, sum)
}

print(result)


func combination<T>(_ targetArr: [T], _ n : Int) -> [[T]] {
    var results = [[T]]()
    if targetArr.count < n { return results }
    func cycle(_ idx: Int, _ arr: [T]) {
        if arr.count == n {
            results.append(arr)
            return
        }
        for i in idx..<targetArr.count {
            cycle(i+1, arr + [targetArr[i]])
        }
    }
    cycle(0, [])
    return results
}

func distance(_ chicken: (Int, Int), _ house: (Int, Int)) -> Int {
    return abs(chicken.0 - house.0) + abs(chicken.1 - house.1)
}