๋ฌธ์
๊ธฐ์กด ๋ฌธ์ ์ธ ์ฒด์คํ ๋ค์ ์น ํ๊ธฐ์ ๊ฒฝ์ฐ์๋ ์ ํ ์ฌํญ์ด ์ฌ์ ๋ก์์ ๋จ์ํ ๋ธ๋ฃจํธํฌ์ค๋ก ํด๊ฒฐ์ด ๊ฐ๋ฅํ์ง๋ง, ํด๋น ๋ฌธ์ ์ ๊ฒฝ์ฐ ๋ฌธ์ ์ ์ ํ ์ฌํญ(N, M ≤ 2000, 1 ≤ K ≤ min(N, M))๊ณผ ์๊ฐ ์ ํ 1์ด๋ฅผ ๊ณ ๋ คํ์ ๋, O(N²)
์ดํ์ ์๊ฐ๋ณต์ก๋๋ฅผ ๊ฐ์ง ์๊ณ ๋ฆฌ์ฆ์ ์ค๊ณํด์ผ ํฉ๋๋ค.
์์ญ์ ์ ํํ ๋, ์ค๋ณต๋๋ ์์ญ์ ์ ํํ๋ ๊ฒฝ์ฐ๊ฐ ๋ฐ์ํ๊ธฐ ๋๋ฌธ์ ๋ชจ๋ ์์ญ๋ง๋ค K²๊ฐ์ ์นธ์ ๋ค์ ๊ณ์ฐํ๋ ๊ฒ์ ๋นํจ์จ์ ์ ๋๋ค. ์ด ์ค๋ณต ๊ณ์ฐ์ ํผํ๊ธฐ ์ํด์ ๋์ ํฉ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๋ค์๊ณผ ๊ฐ์ ๋จ๊ณ๋ฅผ ๊ฑฐ์นฉ๋๋ค:
- ๊ฐ ์นธ์ด ๋ ๊ฐ์ง ์ฒด์คํ ํจํด(ํฐ์/๊ฒ์์ ์์)๊ณผ ์ผ๋ง๋ ๋ค๋ฅธ์ง ๊ณ์ฐ
- ์ด ์ ๋ณด๋ฅผ ๋ฐํ์ผ๋ก ๋์ ํฉ ๊ณ์ฐ
- ๋ชจ๋ ๊ฐ๋ฅํ K×K ์์ญ์ ๋ํด ์ต์ ๋ณ๊ฒฝ ์ ๊ณ์ฐ
ํ์ด
- ์๊ฐ๋ณต์ก๋:
O(N×M)
(N: ๋ณด๋์ ์ธ๋ก ๊ธธ์ด, M: ๋ณด๋์ ๊ฐ๋ก ๊ธธ์ด)
const input = require('fs').readFileSync("/dev/stdin").toString().trim().split('\n');
const [N, M, K] = input[0].split(" ").map(Number);
const board = input.slice(1, N + 1);
function solution() {
// ๋ณด๋ ์ ์ฒด์ ๋ํด ๋ค์ ์น ํด์ผ ํ๋์ง ์ฌ๋ถ๋ฅผ ๊ณ์ฐ
// 1: ๋ค์ ์น ํด์ผ ํจ, 0: ๊ทธ๋๋ก ๋๋ฉด ๋จ
const whiteStart = Array.from({ length: N }, () => Array(M).fill(0));
const blackStart = Array.from({ length: N }, () => Array(M).fill(0));
// ๋ชจ๋ ์นธ์ ๋ํด ๋ ๊ฐ์ง ๊ฒฝ์ฐ(ํฐ์/๊ฒ์์ ์์) ๋ชจ๋ ๊ณ์ฐ
for (let i = 0; i < N; i++) {
for (let j = 0; j < M; j++) {
// ํฐ์์ผ๋ก ์์ํ๋ ์ฒด์คํ์ผ ๋ ์์ ์์
const expectedWhiteStart = ((i + j) % 2 === 0) ? 'W' : 'B';
if (board[i][j] !== expectedWhiteStart) {
whiteStart[i][j] = 1;
} else {
blackStart[i][j] = 1;
}
}
}
// ๋์ ํฉ ๊ณ์ฐ (ํฐ์ ์์)
const prefixWhite = Array.from({ length: N + 1 }, () => Array(M + 1).fill(0));
for (let i = 0; i < N; i++) {
for (let j = 0; j < M; j++) {
prefixWhite[i + 1][j + 1] = prefixWhite[i + 1][j] + prefixWhite[i][j + 1] - prefixWhite[i][j] + whiteStart[i][j];
}
}
// ๋์ ํฉ ๊ณ์ฐ (๊ฒ์์ ์์)
const prefixBlack = Array.from({ length: N + 1 }, () => Array(M + 1).fill(0));
for (let i = 0; i < N; i++) {
for (let j = 0; j < M; j++) {
prefixBlack[i + 1][j + 1] = prefixBlack[i + 1][j] + prefixBlack[i][j + 1] - prefixBlack[i][j] + blackStart[i][j];
}
}
// ๋ชจ๋ ๊ฐ๋ฅํ KxK ์ฒด์คํ ์์น์์ ์ต์๊ฐ ์ฐพ๊ธฐ
let minRepaints = Infinity;
for (let i = K; i <= N; i++) {
for (let j = K; j <= M; j++) {
// KxK ์์ญ์ ๋ค์ ์น ํด์ผ ํ๋ ์นธ์ ์ ๊ณ์ฐ (ํฐ์ ์์)
const whiteCaseRepaints = prefixWhite[i][j] - prefixWhite[i - K][j] - prefixWhite[i][j - K] + prefixWhite[i - K][j - K];
// KxK ์์ญ์ ๋ค์ ์น ํด์ผ ํ๋ ์นธ์ ์ ๊ณ์ฐ (๊ฒ์์ ์์)
const blackCaseRepaints = prefixBlack[i][j] - prefixBlack[i - K][j] - prefixBlack[i][j - K] + prefixBlack[i - K][j - K];
// ๋ ์์ ๊ฐ์ ์ ํ
minRepaints = Math.min(minRepaints, whiteCaseRepaints, blackCaseRepaints);
}
}
return minRepaints;
}
console.log(solution());
๋์ ํฉ์ ์ด์ฉํ K×K ์์ญ ๊ณ์ฐ์ ์๋์ ๊ฐ์ด ์ด๋ฃจ์ด์ง๋๋ค.
์ฌ๊ธฐ์ ์ฝ๊ฐ ํท๊ฐ๋ฆด ์ ์๋ ๋ถ๋ถ์ "์ ์ฒด ๋ณด๋์ ์ฒด์คํ ํจํด"๊ณผ "์ ํ๋ K×K ์์ญ์ ์ฒด์คํ ํจํด" ์ฌ์ด์ ๊ด๊ณ์ ๋๋ค. ์ฝ๋์์ ๋ค์ ๋ถ๋ถ์ ์ดํด๋ณด๊ฒ ์ต๋๋ค:
const whiteRepaints = prefixWhite[i][j] - prefixWhite[i - K][j] - prefixWhite[i][j - K] + prefixWhite[i - K][j - K];
const blackRepaints = prefixBlack[i][j] - prefixBlack[i - K][j] - prefixBlack[i][j - K] + prefixBlack[i - K][j - K];
whiteRepaints
๋ "์ ์ฒด ๋ณด๋๊ฐ (0,0)์์ ํฐ์์ผ๋ก ์์ํ๋ ์ฒด์คํ์ด๋ผ๋ฉด, ํ์ฌ ์ ํํ K×K ์์ญ์ ์ด ํจํด์ ๋ง์ถ๊ธฐ ์ํด ๋ค์ ์น ํด์ผ ํ๋ ์นธ์ ์"๋ฅผ ๊ณ์ฐํฉ๋๋ค. blackRepaints
๋ ์ ์ฌํ๊ฒ "์ ์ฒด ๋ณด๋๊ฐ (0,0)์์ ๊ฒ์์์ผ๋ก ์์ํ๋ ์ฒด์คํ"์ ๋ง์ถ๋ ๋น์ฉ์ ๊ณ์ฐํฉ๋๋ค.
๊ทธ๋ฐ๋ฐ ์ฐ๋ฆฌ๊ฐ ์ค์ ๋ก ์ํ๋ ๊ฒ์ "K×K ์์ญ ์์ฒด๋ฅผ ์ผ์ชฝ ์๊ฐ ํฐ์ ๋๋ ๊ฒ์์์ธ ์ฒด์คํ์ผ๋ก ๋ง๋๋ ๋น์ฉ"์ ๋๋ค. ์ผํ ๋ณด๋ฉด ๋ค๋ฅธ ๊ฐ๋ ์ฒ๋ผ ๋ณด์ด์ง๋ง, ์ด ๋ ๊ณ์ฐ์ ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ๋์ถํฉ๋๋ค.
์ ์ด ๋ฐฉ๋ฒ์ด ์๋ํ๋๊ฐ?
K×K ์์ญ์ "์ผ์ชฝ ์๊ฐ ํฐ์์ธ ์ฒด์คํ"์ผ๋ก ๋ง๋๋ ๋น์ฉ์ ๋ค์ ์ค ํ๋์ ๋์ผํฉ๋๋ค:
- ์ด ์์ญ์ด ์ ์ฒด ํจํด(ํฐ์ ์์)๊ณผ ์ผ์นํ๋๋ก ๋ง๋๋ ๋น์ฉ
- ์ด ์์ญ์ด ์ ์ฒด ํจํด(๊ฒ์์ ์์)๊ณผ ์ผ์นํ๋๋ก ๋ง๋๋ ๋น์ฉ
์ด๋ค ๊ฒ์ ์ฌ์ฉํด์ผ ํ๋์ง๋ K×K ์์ญ์ ์ผ์ชฝ ์ ์นธ (i-K,j-K)์ ์์น์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋๋ค:
- ๋ง์ฝ (i-K,j-K) ์์น๊ฐ ์ ์ฒด ํฐ์ ์์ ํจํด์์ ํฐ์์ด์ด์ผ ํ๋ค๋ฉด,
whiteRepaints
๊ฐ ํด๋น ์์ญ์ ์ผ์ชฝ ์๊ฐ ํฐ์์ธ ์ฒด์คํ์ผ๋ก ๋ง๋๋ ๋น์ฉ์ ๋๋ค. - ๋ง์ฝ (i-K, j-K) ์์น๊ฐ ์ ์ฒด ํฐ์ ์์ ํจํด์์ ๊ฒ์์์ด์ด์ผ ํ๋ค๋ฉด,
blackRepaints
๊ฐ ํด๋น ์์ญ์ ์ผ์ชฝ ์๊ฐ ํฐ์์ธ ์ฒด์คํ์ผ๋ก ๋ง๋๋ ๋น์ฉ์ ๋๋ค.
๊ฒฐ๊ตญ ํญ์ min(whiteRepaints, blackRepaints)
๋ฅผ ์ ํํจ์ผ๋ก์จ, ๊ฐ K×K ์์ญ์ ๋ํด "์ผ์ชฝ ์๊ฐ ํฐ์์ธ ์ฒด์คํ"๊ณผ "์ผ์ชฝ ์๊ฐ ๊ฒ์์์ธ ์ฒด์คํ" ์ค ๋ ์ ์ ๋ณ๊ฒฝ์ด ํ์ํ ํจํด์ ์ ํํฉ๋๋ค.
'๐ข Algorithm' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Javascript][๋ฐฑ์ค] 1091๋ฒ - ์นด๋ ์๊ธฐ (0) | 2025.03.27 |
---|---|
[Javascript][Programmers] ์ ์ ์ผ๊ฐํ (0) | 2025.03.26 |
[Javascript][๋ฐฑ์ค] ์ฒด์คํ ๋ค์ ์น ํ๊ธฐ (0) | 2024.10.05 |
[Javascript][Programmers] ์ ๊ณ ๊ฒฐ๊ณผ ๋ฐ๊ธฐ (2) | 2024.10.02 |
[Javascript][Programmers] ๋ฒ ์คํธ ์จ๋ฒ (1) | 2024.10.01 |