728x90
반응형
목차
https://www.acmicpc.net/problem/20057
문제

문제 구현 방향
퍼지는 것은 쉽게 구현했는데 모래 이동하는 것을 잘못 구해서 헤맸다..
주요 로직
방향 전환
중간 부터 시작해서 제한을 두배씩 늘려가는 식으로 했다.
또한 중간에 도달하면 방향을 바꾸어야 하고 끝에 도달해도 방향을 바꾸어야 한다.
while (1) {
if (x <= 0 && y <= 0) break;
x += dx[dir];
y += dy[dir];
distribute(x, y, dir, board);
board[y][x] = 0;
dnt++;
if (dnt == limit) {
dir = (dir + 1) % 4;
}
if (dnt == limit * 2) {
dnt = 0;
limit++;
dir = (dir + 1) % 4;
}
}
코드 구현
const input = require("fs")
.readFileSync("./dev/stdin", "utf-8")
.trim()
.split("\n");
let N = Number(input[0]);
input.splice(0, 1);
let board = Array.from(Array(N), () => Array(N));
let dx = [-1, 0, 1, 0];
let dy = [0, 1, 0, -1];
for (let i = 0; i < N; i++) {
let ar = input[i].trim().split(" ").map(Number);
for (let j = 0; j < N; j++) {
board[i][j] = ar[j];
}
}
function checking(x, y) {
if (x <= N - 1 && x >= 0 && y <= N - 1 && y >= 0) return true;
else return false;
}
let ans = 0;
function distribute(curx, cury, dir, board) {
let relU = (dir + 3) % 4;
let relD = (dir + 1) % 4;
let relL = dir;
let relR = (dir + 2) % 4;
let curSize = board[cury][curx];
let res7 = Math.floor((board[cury][curx] * 7) / 100);
let res2 = Math.floor((board[cury][curx] * 2) / 100);
let res10 = Math.floor((board[cury][curx] * 10) / 100);
let res5 = Math.floor((board[cury][curx] * 5) / 100);
let res1 = Math.floor((board[cury][curx] * 1) / 100);
let resa = curSize - res7 * 2 - res2 * 2 - res1 * 2 - res10 * 2 - res5;
let nx = curx + dx[relU];
let ny = cury + dy[relU];
if (checking(nx, ny)) {
board[ny][nx] += res7;
} else {
ans += res7;
}
nx = curx + dx[relD];
ny = cury + dy[relD];
if (checking(nx, ny)) {
board[ny][nx] += res7;
} else {
ans += res7;
}
nx = curx + dx[relU] * 2;
ny = cury + dy[relU] * 2;
if (checking(nx, ny)) {
board[ny][nx] += res2;
} else {
ans += res2;
}
nx = curx + dx[relD] * 2;
ny = cury + dy[relD] * 2;
if (checking(nx, ny)) {
board[ny][nx] += res2;
} else {
ans += res2;
}
nx = curx + dx[relU] + dx[relR];
ny = cury + dy[relU] + dy[relR];
if (checking(nx, ny)) {
board[ny][nx] += res1;
} else {
ans += res1;
}
nx = curx + dx[relD] + dx[relR];
ny = cury + dy[relD] + dy[relR];
if (checking(nx, ny)) {
board[ny][nx] += res1;
} else {
ans += res1;
}
nx = curx + dx[relU] + dx[relL];
ny = cury + dy[relU] + dy[relL];
if (checking(nx, ny)) {
board[ny][nx] += res10;
} else {
ans += res10;
}
nx = curx + dx[relD] + dx[relL];
ny = cury + dy[relD] + dy[relL];
if (checking(nx, ny)) {
board[ny][nx] += res10;
} else {
ans += res10;
}
nx = curx + dx[relL] * 2;
ny = cury + dy[relL] * 2;
if (checking(nx, ny)) {
board[ny][nx] += res5;
} else {
ans += res5;
}
nx = curx + dx[relL];
ny = cury + dy[relL];
if (checking(nx, ny)) {
board[ny][nx] += resa;
} else {
ans += resa;
}
}
let x = Math.floor(N / 2);
let y = Math.floor(N / 2);
let limit = 1;
let dnt = 0;
let dir = 0;
while (1) {
if (x <= 0 && y <= 0) break;
x += dx[dir];
y += dy[dir];
distribute(x, y, dir, board);
board[y][x] = 0;
dnt++;
if (dnt == limit) {
dir = (dir + 1) % 4;
}
if (dnt == limit * 2) {
dnt = 0;
limit++;
dir = (dir + 1) % 4;
}
}
console.log(ans);
모래가 퍼지는 것은 무식하게 만들었다... 최적화할 수 있을텐데
반응형
'PS > 백준' 카테고리의 다른 글
| [백준][DP] 2011 암호코드 NodeJs 구현 (0) | 2024.10.21 |
|---|---|
| [백준][dp] 2225 합분해 NodeJs 구현 (1) | 2024.10.19 |
| [백준][구현] 20056 마법사 상어와 파이어볼 NodeJs 구현 (1) | 2024.10.17 |
| [백준][dfs / bfs] 1260 DFS와 BFS NodeJs구현 (0) | 2024.10.14 |
| [백준][백트래킹] 15650 N과 M NodeJs 구현 (3) | 2024.10.14 |