1018번: 체스판 다시 칠하기
typealias Board = Array<Array<Character>>
let nums = readLine()!.split(separator: " ").map { Int(String($0))! }
let N = nums[0], M = nums[1]
var input = [Array<Character>]()
for _ in 0..<N {
let line = readLine()!.map { $0 }
input.append(line)
}
func countRepaint(board: Board) -> Int {
var result1 = 0
var result2 = 0
for i in 0..<8 {
for j in 0..<8 {
if (i + j) % 2 == 0 {
if board[i][j] == "B" {
result1 += 1
} else {
result2 += 1
}
} else {
if board[i][j] == "W" {
result1 += 1
} else {
result2 += 1
}
}
}
}
return min(result1, result2)
}
func getBoard(x: Int, y: Int) -> Board {
var board = [Array<Character>]()
for i in 0..<8 {
board.append(Array(input[x + i][y..<y+8]))
}
return board
}
var result = 64
for x in 0..<(N-7) {
for y in 0..<(M-7) {
let board = getBoard(x: x, y: y)
result = min(result, countRepaint(board: board))
}
}
print(result)
- 주어진 입력에 특정한 규칙이 없으므로 모든 경우의 수를 계산해서 푸는 문제입니다.
- 다시 칠하는 칸을 계산하는 함수를 만듭니다.
- 체스판은 체스판은 BWBW로 반복되거나 WBWB로 반복되는 구조이므로
- 각각의 경우에 맞추어 다시 칠해야하는 칸을 센 후
- 둘 중에 작은 수를 리턴합니다.
- [x][y]를 기준으로 체스판을 잘라오는 함수를 만듭니다.
- 모든 경우의 수를 순회하면서 답을 구합니다.