티스토리 뷰
https://www.acmicpc.net/problem/23290
23290번: 마법사 상어와 복제
첫째 줄에 물고기의 수 M, 상어가 마법을 연습한 횟수 S가 주어진다. 둘째 줄부터 M개의 줄에는 물고기의 정보 fx, fy, d가 주어진다. (fx, fy)는 물고기의 위치를 의미하고, d는 방향을 의미한다. 방향
www.acmicpc.net
메모리에 관대한 문제다. 줄이려면 줄일 수 있지만 귀찮다😅
const input = require('fs')
.readFileSync('./dev/stdin')
.toString()
.trim()
.split('\n')
.map((v) => v.trim().split(' ').map(Number));
const [M, S] = input.shift();
let board = Array.from(Array(4), () => Array.from(Array(4), () => []));
const dx = [0, -1, -1, -1, 0, 1, 1, 1];
const dy = [-1, -1, 0, 1, 1, 1, 0, -1];
const sdx = [-1, 0, 1, 0];
const sdy = [0, -1, 0, 1];
for (let i = 0; i < M; i++) {
const [fx, fy, d] = input.shift().map((v) => v - 1);
board[fx][fy].push(d);
}
let [sx, sy] = input.shift().map((v) => v - 1);
let fishSmell = Array.from(Array(4), () => Array(4).fill(0));
for (let practice = 0; practice < S; practice++) {
// 복제마법쓰기
const duplicatedFish = [];
for (let i = 0; i < 4; i++) {
for (let j = 0; j < 4; j++) {
for (let k = 0; k < board[i][j].length; k++) {
duplicatedFish.push([i, j, board[i][j][k]]);
}
}
}
// 물고기 이동하기
let newBoard = Array.from(Array(4), () => Array.from(Array(4), () => new Array()));
duplicatedFish.forEach((fish) => {
const [fx, fy, d] = fish;
let haveMoved = false;
for (let k = 0; k < 8; k++) {
const fk = d - k < 0 ? 8 + (d - k) : d - k;
const nx = fx + dx[fk];
const ny = fy + dy[fk];
if (nx < 0 || ny < 0 || nx >= 4 || ny >= 4) continue;
if (nx == sx && ny == sy) continue;
if (fishSmell[nx][ny] > 0) continue;
newBoard[nx][ny].push(fk);
haveMoved = true;
break;
}
if (!haveMoved) {
newBoard[fx][fy].push(d);
}
});
// 상어 이동하기
let max = -1;
let path = [];
for (let i = 0; i < 4; i++) {
const nsx = sx + sdx[i];
const nsy = sy + sdy[i];
if (nsx < 0 || nsy < 0 || nsx >= 4 || nsy >= 4) continue;
const fishI = newBoard[nsx][nsy].length;
for (let j = 0; j < 4; j++) {
const nnsx = nsx + sdx[j];
const nnsy = nsy + sdy[j];
if (nnsx < 0 || nnsy < 0 || nnsx >= 4 || nnsy >= 4) continue;
const fishJ = newBoard[nnsx][nnsy].length;
for (let k = 0; k < 4; k++) {
const nnnsx = nnsx + sdx[k];
const nnnsy = nnsy + sdy[k];
if (nnnsx < 0 || nnnsy < 0 || nnnsx >= 4 || nnnsy >= 4) continue;
const fishK = nnnsx == nsx && nnnsy == nsy ? 0 : newBoard[nnnsx][nnnsy].length;
const fishTotal = fishI + fishJ + fishK;
if (fishTotal > max) {
max = fishTotal;
path = [i, j, k];
}
}
}
}
path.forEach((k) => {
sx = sx + sdx[k];
sy = sy + sdy[k];
if (newBoard[sx][sy].length > 0) fishSmell[sx][sy] = 3;
newBoard[sx][sy] = [];
});
// 2턴전 물고기 냄새 사라짐
for (let i = 0; i < 4; i++) {
for (let j = 0; j < 4; j++) {
if (fishSmell[i][j] > 0) fishSmell[i][j]--;
}
}
//복제하기
duplicatedFish.forEach((fish) => {
const [fx, fy, d] = fish;
newBoard[fx][fy].push(d);
});
board = newBoard;
}
let answer = 0;
for (let i = 0; i < 4; i++) {
for (let j = 0; j < 4; j++) {
answer += board[i][j].length;
}
}
console.log(answer);
728x90
'자료구조 알고리즘 > 백준' 카테고리의 다른 글
Node.js) 백준 2083번: 럭비 클럽 (0) | 2023.08.01 |
---|---|
Node.js) 백준 21609번: 상어 중학교 (0) | 2023.07.31 |
Node.js) 백준 21611번: 마법사 상어와 블리자드 (0) | 2023.07.30 |
Node.js) 백준 27323번: 직사각형 (0) | 2023.07.30 |
Node.js) 백준 2754번: 학점계산 (0) | 2023.07.29 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- create databases;
- DB 생성
- 투포인터 연습
- 면접질문
- create db
- 동적프로그래밍
- 투포인터
- 그래프
- 면접비
- 다이나믹프로그래밍
- 개발자면접
- 서버점검
- BFS
- MySQL
- MOD
- node.js
- 로드나인
- 다이나밍프로그래밍
- 은둔청년체험
- 롱베케이션
- 최소공통조상
- 서버개발
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
글 보관함