티스토리 뷰

PS

[Swift] 백준_스타트와 링크(14889)

희철 2023. 1. 20. 16:09

문제

 

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

 

14889번: 스타트와 링크

예제 2의 경우에 (1, 3, 6), (2, 4, 5)로 팀을 나누면 되고, 예제 3의 경우에는 (1, 2, 4, 5), (3, 6, 7, 8)로 팀을 나누면 된다.

www.acmicpc.net

 

 

풀이

 

dfs를 이용해  n / 2만큼의 팀원이 차면 계산을 해주도록 하였다.

순서는 상관없으므로 idx라는 파라미터를 이용해 선택된 팀원부터 진행할 수 있도록 하였다. 

 

check[i]를 true로 바꿔주면 count가  n / 2가 된 시점에는 true인 사람 반, false인 사람 반이 돼서 팀이 만들어진다.

 

이후에 반복문을 이용해 true라면 더해주고, false라면 빼주도록 한 뒤에 절댓값을 이용해 기존의 result와 비교해서 더 작은 값을 result에 넣어주었다.

result의 초기값은 임의로 큰 수로 지정하였따.

import Foundation

let n = Int(readLine()!)!
var point: [[Int]] = []
var result = 9999999
var check = Array(repeating: false, count: n)
for _ in 0..<n {
    point.append(readLine()!.split(separator: " ").map { Int(String($0))! })
}
func dfs(_ count: Int, _ idx: Int) {
    if count == n / 2 {
        var temp = 0
        for i in 0..<n {
            for j in 0..<n {
                if check[i] && check[j] {
                    temp += point[i][j]
                } else if !check[i] && !check[j] {
                    temp -= point[i][j]
                }
            }
        }
        result = min(result, abs(temp))
        return
    }
    for i in idx..<n {
        if !check[i] {
            check[i] = true
            dfs(count + 1,i)
            check[i] = false
        }
    }
}
dfs(0,0)
print(result)

 

 

_____________________________________________________________________________________________________

 

 

더 나은 방법이 있겠지라는 생각으로 버리는 시간이 많다. 시간초과가 날지라도 일단 구현해보자.

'PS' 카테고리의 다른 글

[Swift] 백준_스도쿠(2580)  (0) 2023.01.21
[Swift] 백준_연산자 끼워넣기(14888)  (0) 2023.01.20
[Swift] 백준_N-Queen(9663)  (0) 2023.01.20
[Swift] 백준_N과 M(12)(15666)  (0) 2023.01.18
[Swift] 백준_N과 M(11)(15665)  (0) 2023.01.18
댓글
최근에 올라온 글
Total
Today
Yesterday