Skip to content

Commit 2db1851

Browse files
committed
[Gold IV] Title: 체스판 다시 칠하기 2, Time: 468 ms, Memory: 146768 KB -BaekjoonHub
1 parent 941c288 commit 2db1851

2 files changed

Lines changed: 81 additions & 0 deletions

File tree

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
# [Gold IV] 체스판 다시 칠하기 2 - 25682
2+
3+
[문제 링크](https://www.acmicpc.net/problem/25682)
4+
5+
### 성능 요약
6+
7+
메모리: 146768 KB, 시간: 468 ms
8+
9+
### 분류
10+
11+
누적 합
12+
13+
### 제출 일자
14+
15+
2026년 3월 9일 09:34:29
16+
17+
### 문제 설명
18+
19+
<p>지민이는 자신의 저택에서 MN개의 단위 정사각형으로 나누어져 있는 M×N 크기의 보드를 찾았다. 어떤 정사각형은 검은색으로 칠해져 있고, 나머지는 흰색으로 칠해져 있다. 지민이는 이 보드를 잘라서 K×K 크기의 체스판으로 만들려고 한다.</p>
20+
21+
<p>체스판은 검은색과 흰색이 번갈아서 칠해져 있어야 한다. 구체적으로, 각 칸이 검은색과 흰색 중 하나로 색칠되어 있고, 변을 공유하는 두 개의 사각형은 다른 색으로 칠해져 있어야 한다. 따라서 이 정의를 따르면 체스판을 색칠하는 경우는 두 가지뿐이다. 하나는 맨 왼쪽 위 칸이 흰색인 경우, 하나는 검은색인 경우이다.</p>
22+
23+
<p>보드가 체스판처럼 칠해져 있다는 보장이 없어서, 지민이는 K×K 크기의 체스판으로 잘라낸 후에 몇 개의 정사각형을 다시 칠해야겠다고 생각했다. 당연히 K×K 크기는 아무데서나 골라도 된다. 지민이가 다시 칠해야 하는 정사각형의 최소 개수를 구하는 프로그램을 작성하시오.</p>
24+
25+
### 입력
26+
27+
<p>첫째 줄에 정수 N, M, K가 주어진다. 둘째 줄부터 N개의 줄에는 보드의 각 행의 상태가 주어진다. B는 검은색이며, W는 흰색이다.</p>
28+
29+
### 출력
30+
31+
<p>첫째 줄에 지민이가 잘라낸 K×K 보드를 체스판으로 만들기 위해 다시 칠해야 하는 정사각형 개수의 최솟값을 출력한다.</p>
32+
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
import Foundation
2+
3+
let input = readLine()!.split(separator: " ").map{Int($0)!},
4+
N = input[0],
5+
M = input[1],
6+
K = input[2]
7+
8+
var board = [String]()
9+
10+
for _ in 0..<N {
11+
board.append(readLine()!)
12+
}
13+
14+
var ps1 = [[Int]](repeating: [Int](repeating: 0, count: M+1), count: N+1)
15+
var ps2 = [[Int]](repeating: [Int](repeating: 0, count: M+1), count: N+1)
16+
17+
for i in 1...N {
18+
let row = Array(board[i-1])
19+
for j in 1...M {
20+
21+
let current = row[j-1]
22+
23+
let expectedW = ((i+j) % 2 == 0) ? "W" : "B"
24+
let expectedB = ((i+j) % 2 == 0) ? "B" : "W"
25+
26+
let mis1 = (String(current) == expectedW) ? 0 : 1
27+
let mis2 = (String(current) == expectedB) ? 0 : 1
28+
29+
ps1[i][j] = ps1[i-1][j] + ps1[i][j-1] - ps1[i-1][j-1] + mis1
30+
ps2[i][j] = ps2[i-1][j] + ps2[i][j-1] - ps2[i-1][j-1] + mis2
31+
}
32+
}
33+
34+
var answer = Int.max
35+
36+
for i in K...N {
37+
for j in K...M {
38+
39+
let r1 = i-K+1
40+
let c1 = j-K+1
41+
42+
let s1 = ps1[i][j] - ps1[r1-1][j] - ps1[i][c1-1] + ps1[r1-1][c1-1]
43+
let s2 = ps2[i][j] - ps2[r1-1][j] - ps2[i][c1-1] + ps2[r1-1][c1-1]
44+
45+
answer = min(answer, s1, s2)
46+
}
47+
}
48+
49+
print(answer)

0 commit comments

Comments
 (0)