๋ณธ ํ์ด๋ ํ๋ก๋๋์ ํ์ด๋ฅผ ํด์ํ์์์ ๋ฏธ๋ฆฌ ๋ฐํ๋๋ค.
๐งก๋ฌธ์ ์ค๋ช
๋นํ๊ฐ ๊นจ์ง๋ฉด์ ์ค๋
ธ์ฐํ์ด์ ๋ ๋ด๋ ค ์จ "์ฃ ๋ฅด๋"๋ ์ธ์ 2๋ง์ ์ํด ์ฃผํ ๊ฑด์ถ์ฌ์
์ ๋ฐ์ด๋ค๊ธฐ๋ก ๊ฒฐ์ฌํ์์ต๋๋ค. "์ฃ ๋ฅด๋"๋ ๊ธฐ๋ฅ๊ณผ ๋ณด๋ฅผ ์ด์ฉํ์ฌ ๋ฒฝ๋ฉด ๊ตฌ์กฐ๋ฌผ์ ์๋์ผ๋ก ์ธ์ฐ๋ ๋ก๋ด์ ๊ฐ๋ฐํ ๊ณํ์ธ๋ฐ, ๊ทธ์ ์์ ๋ก๋ด์ ๋์์ ์๋ฎฌ๋ ์ด์
ํ ์ ์๋ ํ๋ก๊ทธ๋จ์ ๋ง๋ค๊ณ ์์ต๋๋ค.
ํ๋ก๊ทธ๋จ์ 2์ฐจ์ ๊ฐ์ ๋ฒฝ๋ฉด์ ๊ธฐ๋ฅ๊ณผ ๋ณด๋ฅผ ์ด์ฉํ ๊ตฌ์กฐ๋ฌผ์ ์ค์นํ ์ ์๋๋ฐ, ๊ธฐ๋ฅ๊ณผ ๋ณด๋ ๊ธธ์ด๊ฐ 1์ธ ์ ๋ถ์ผ๋ก ํํ๋๋ฉฐ ๋ค์๊ณผ ๊ฐ์ ๊ท์น์ ๊ฐ์ง๊ณ ์์ต๋๋ค.
๋จ, ๋ฐ๋ฅ์ ๋ฒฝ๋ฉด์ ๋งจ ์๋ ์ง๋ฉด์ ๋งํฉ๋๋ค.
2์ฐจ์ ๋ฒฝ๋ฉด์ n x n
ํฌ๊ธฐ ์ ์ฌ๊ฐ ๊ฒฉ์ ํํ์ด๋ฉฐ, ๊ฐ ๊ฒฉ์๋ 1 x 1
ํฌ๊ธฐ์
๋๋ค. ๋งจ ์ฒ์ ๋ฒฝ๋ฉด์ ๋น์ด์๋ ์ํ์
๋๋ค. ๊ธฐ๋ฅ๊ณผ ๋ณด๋ ๊ฒฉ์์ ์ ๊ต์ฐจ์ ์ ๊ฑธ์น์ง ์๊ณ , ๊ฒฉ์ ์นธ์ ๊ฐ ๋ณ์ ์ ํํ ์ผ์นํ๋๋ก ์ค์นํ ์ ์์ต๋๋ค. ๋ค์์ ๊ธฐ๋ฅ๊ณผ ๋ณด๋ฅผ ์ค์นํด ๊ตฌ์กฐ๋ฌผ์ ๋ง๋ ์์์
๋๋ค.
์๋ฅผ ๋ค์ด, ์ ๊ทธ๋ฆผ์ ๋ค์ ์์์ ๋ฐ๋ผ ๊ตฌ์กฐ๋ฌผ์ ๋ง๋ค์์ต๋๋ค.
๋ง์ฝ (4, 2)์์ ์ค๋ฅธ์ชฝ์ผ๋ก ๋ณด๋ฅผ ๋จผ์ ์ค์นํ์ง ์๊ณ , (3, 2)์์ ์ค๋ฅธ์ชฝ์ผ๋ก ๋ณด๋ฅผ ์ค์นํ๋ ค ํ๋ค๋ฉด 2๋ฒ ๊ท์น์ ๋ง์ง ์์ผ๋ฏ๋ก ์ค์น๊ฐ ๋์ง ์์ต๋๋ค. ๊ธฐ๋ฅ๊ณผ ๋ณด๋ฅผ ์ญ์ ํ๋ ๊ธฐ๋ฅ๋ ์๋๋ฐ ๊ธฐ๋ฅ๊ณผ ๋ณด๋ฅผ ์ญ์ ํ ํ์ ๋จ์ ๊ธฐ๋ฅ๊ณผ ๋ณด๋ค ๋ํ ์ ๊ท์น์ ๋ง์กฑํด์ผ ํฉ๋๋ค. ๋ง์ฝ, ์์ ์ ์ํํ ๊ฒฐ๊ณผ๊ฐ ์กฐ๊ฑด์ ๋ง์กฑํ์ง ์๋๋ค๋ฉด ํด๋น ์์ ์ ๋ฌด์๋ฉ๋๋ค.
๋ฒฝ๋ฉด์ ํฌ๊ธฐ n, ๊ธฐ๋ฅ๊ณผ ๋ณด๋ฅผ ์ค์นํ๊ฑฐ๋ ์ญ์ ํ๋ ์์ ์ด ์์๋๋ก ๋ด๊ธด 2์ฐจ์ ๋ฐฐ์ด build_frame์ด ๋งค๊ฐ๋ณ์๋ก ์ฃผ์ด์ง ๋, ๋ชจ๋ ๋ช ๋ น์ด๋ฅผ ์ํํ ํ ๊ตฌ์กฐ๋ฌผ์ ์ํ๋ฅผ return ํ๋๋ก solution ํจ์๋ฅผ ์์ฑํด์ฃผ์ธ์.
๐์ ํ์ฌํญ
๐์ ์ถ๋ ฅ ์
n | build_frame | result |
---|---|---|
5 | [[1,0,0,1],[1,1,1,1],[2,1,0,1],[2,2,1,1],[5,0,0,1],[5,1,0,1],[4,2,1,1],[3,2,1,1]] | [[1,0,0],[1,1,1],[2,1,0],[2,2,1],[3,2,1],[4,2,1],[5,0,0],[5,1,0]] |
5 | [[0,0,0,1],[2,0,0,1],[4,0,0,1],[0,1,1,1],[1,1,1,1],[2,1,1,1],[3,1,1,1],[2,0,0,0],[1,1,1,0],[2,2,0,1]] | [[0,0,0],[0,1,1],[1,1,1],[2,1,1],[3,1,1],[4,0,0]] |
๐์ ์ถ๋ ฅ ์์ ๋ํ ์ค๋ช
์ ์ถ๋ ฅ ์ #1
์ ์ถ๋ ฅ ์ #2
์ํ ๋ฒ์งธ ์์ ์ ๊ฒฝ์ฐ, (1, 1)์์ ์ค๋ฅธ์ชฝ์ ์๋ ๋ณด๋ฅผ ์ญ์ ํ๋ฉด (2, 1)์์ ์ค๋ฅธ์ชฝ์ ์๋ ๋ณด๋ ์กฐ๊ฑด์ ๋ง์กฑํ์ง ์์ผ๋ฏ๋ก ๋ฌด์๋ฉ๋๋ค.
์ด ๋ฒ์งธ ์์ ์ ๊ฒฝ์ฐ, (2, 2)์์ ์์ชฝ ๋ฐฉํฅ์ผ๋ก ๊ธฐ๋ฅ์ ์ธ์ธ ๊ฒฝ์ฐ ์กฐ๊ฑด์ ๋ง์กฑํ์ง ์์ผ๋ฏ๋ก ๋ฌด์๋ฉ๋๋ค.
๐๋์ ํ์ด
ํด๋น ๋ฌธ์ ๋ DP ํ์ด์ ๋ฌธ์ ๋ก ํจ์จ์ ์ธ ๊ฑฑ์ ์ ํ์ง ์์๋ ๋์ง๋ง, ๋ค์ํ ๊ฒฝ์ฐ์ ์๋ฅผ ๊ณ ๋ คํด์ผํ๋ค.
function solution(n, build_frame) {
// ๊ธฐ๋ฅ์ ๋ฐ๋ฅ ์์ ์๊ฑฐ๋ ๋ณด์ ํ์ชฝ ๋ ๋ถ๋ถ ์์ ์๊ฑฐ๋, ๋๋ ๋ค๋ฅธ ๊ธฐ๋ฅ ์์ ์์ด์ผ ํฉ๋๋ค.
// ๋ณด๋ ํ์ชฝ ๋ ๋ถ๋ถ์ด ๊ธฐ๋ฅ ์์ ์๊ฑฐ๋, ๋๋ ์์ชฝ ๋ ๋ถ๋ถ์ด ๋ค๋ฅธ ๋ณด์ ๋์์ ์ฐ๊ฒฐ๋์ด ์์ด์ผ ํฉ๋๋ค.
// [x, y, a, b] = [๊ฐ๋ก ์ขํ, ์ธ๋ก ์ขํ, type, isInstall]
// type: 0(๊ธฐ๋ฅ), 1(๋ณด)
// isInstall: 0(์ญ์ ), 1(์ค์น)
// build_frame ์์๋ฅผ ์ฐจ๋ก๋ก ๊ฒ์ฌํ๋ฉด์
// ์ถ๊ฐ ๊ฐ๋ฅํ๋ฉด ์ถ๊ฐํด์ฃผ๊ณ , ์ญ์ ๊ฐ๋ฅํ๋ฉด ์ญ์ ํด์ค๋ค.
const frames = [];
build_frame.forEach((frame) => {
const [x, y, type, isInstall] = frame;
if (isInstall) {
// ์ค์น
if (checkAdd(x, y, type, frames)) frames.push([x, y, type]);
}
// ์ ๊ฑฐ
else checkDelete(x, y, type, frames);
})
// x ์ขํ ๊ธฐ์ค ์ค๋ฆ์ฐจ ์ ์ ๋ ฌ, ๊ฐ๋ค๋ฉด y์ขํ ์ค๋ฆ์ฐจ ์, ๋ชจ๋ ๊ฐ๋ค๋ฉด ๊ธฐ๋ฅ์ด ๋ณด๋ณด๋ค ์์ผ๋ก
return frames.sort((a, b) => a[0] === b[0] ? a[1] === b[1] ? a[2] - b[2] : a[1] - b[1] : a[0] - b[0]);
}
function checkAdd(x, y, type, frames) {
if (type) {
// ๋ณด์ธ ๊ฒฝ์ฐ
// 1. frames ์ค์ ๋ณด์ด๋ฉด์ ny = y ์ด๋ฉด์ nx๊ฐ x-1์ธ๊ฒ ์๊ณ , nx๊ฐ x+1์ธ๊ฑฐ ์์ผ๋ฉด ์ฐธ
// 2. frames ์ค์ ๊ธฐ๋ฅ์ด๋ฉด์ nx === x ์ด๋ฉด์ ny === y-1์ธ๊ฒ ์์ผ๋ฉด ์ฐธ
// 3. frames ์ค์ ๊ธฐ๋ฅ์ด๋ฉด์ nx = x + 1, ny = y + -1 ์ธ๊ฒ ์์ผ๋ฉด ์ฐธ
if (frames.find(([nx, ny, ntype]) => !ntype && nx === x && ny === y - 1)) return true;
if (frames.find(([nx, ny, ntype]) => !ntype && nx === x + 1 && ny === y - 1)) return true;
if (frames.find(([nx, ny, ntype]) => ntype && ny === y && nx === x - 1) &&
frames.find(([nx, ny, ntype]) => ntype && ny === y && nx === x + 1)) return true;
return false;
} else {
// ๊ธฐ๋ฅ์ธ ๊ฒฝ์ฐ
// 1. y === 0 ์ด๋ฉด ๋ฌด์กฐ๊ฑด ์ฐธ
// 2. ๊ธฐ๋ฅ์ด๋ฉด์ x๋ ๊ฐ๊ณ , ny = y-1 ์ธ๊ฒ ์์ผ๋ฉด ์ฐธ
// 3. ๋ณด์ด๋ฉด์ x, y ๊ฐ์๊ฒ ์์ผ๋ฉด ์ฐธ
// 4. ๋ณด์ด๋ฉด์ nx = x - 1, ny = y์ธ๊ฒ ์์ผ๋ฉด ์ฐธ
// some ํจ์๋ก ๋์ฒด ๊ฐ๋ฅ
if (y === 0) return true;
if (frames.find(([nx, ny, ntype]) => !ntype && nx === x && ny === y - 1)) return true;
if (frames.find(([nx, ny, ntype]) => ntype && nx === x && ny === y)) return true;
if (frames.find(([nx, ny, ntype]) => ntype && nx === x - 1 && ny === y)) return true;
return false;
}
}
function checkDelete(x, y, type, frames) {
// ํ๋ ์ ๋ฐฐ์ด ๋ณต์ฌ
const copy = frames.slice();
// ์ญ์ ๋ ์ธ๋ฑ์ค ๊ฒ์
// filter ํจ์๋ก ๋์ฒด ๊ฐ๋ฅ
const delIdx = copy.findIndex(([nx, ny, ntype]) => type === ntype && x === nx && y === ny);
copy.splice(delIdx, 1);
// ์ ๊ฑฐ๋ ์ํ์์ ํ๋ ์๋ค์ด ์กฐ๊ฑด์ ๋ชจ๋ ๋ง์กฑํ๋์ง ๊ฒ์ฌ
for (let frame of copy) {
const [nx, ny, ntype] = frame;
if (!checkAdd(nx, ny, ntype, copy)) return;
}
frames.splice(delIdx, 1);
}