728x90
반응형
목차
https://www.acmicpc.net/problem/20056
문제
문제 구현시 주의점
격자의 행과 열은 1번부터 N번까지 번호가 매겨져 있고, 1번 행은 N번과 연결되어 있고, 1번 열은 N번과 연결되어 있다는 조건에서 좌표가 순환한다는 것을 캐치해야 한다.
문제 구현 아이디어
좌표 순환에 대한 해결 방법
아래와 같이 패턴을 찾아 한번에 계산하도록 하였다.
function convertpos(pos) {
if (pos <= N && pos >= 0) {
if (pos === 0) return N;
return pos;
} else if (pos > N) {
if (pos % N === 0) return N;
return pos % N;
} else if (pos < 0) {
return N + (pos % N);
}
}
좌표 홀짝에 관한 방향성 정하기
function checking(arr) {
let flag;
for (let i = 0; i < arr.length; i++) {
if (i == 0) {
flag = arr[i] % 2;
continue;
}
if (flag != arr[i] % 2) {
return 0;
}
}
return 1;
}
NodeJs로 배열 해쉬테이블 만들기
let firemap = new Map();
function addValueToMap(key, value) {
if (!firemap.has(key)) {
firemap.set(key, []);
}
firemap.get(key).push(value);
}
Js구현 시 주의점
c++과 같은 기능의 나눗셈을 해줄려면 trunc를 써주어야 한다.
sumM = Math.trunc((sumM /= 5));
sumS = Math.trunc(sumS / arr.length);
해쉬맵의 키 값은 이런식으로 값으로 해야한다.
객체는 다른 참조이기 때문에 중복 해쉬검사가 제대로 작동하지 않는다.
addValueToMap(`${sx}_${sy}`, fireballs[j]);
코드 구현
const input = require("fs")
.readFileSync("./dev/stdin", "utf-8")
.trim()
.split("\n");
let fireballs = [];
let [N, M, K] = input[0].split(" ").map(Number);
input.splice(0, 1);
for (let i = 0; i < M; i++) {
let k = input[i].split(" ").map(Number);
fireballs.push({ r: k[0], c: k[1], m: k[2], s: k[3], d: k[4] });
}
let dx = [0, 1, 1, 1, 0, -1, -1, -1];
let dy = [-1, -1, 0, 1, 1, 1, 0, -1];
//1~N
let firemap = new Map();
function addValueToMap(key, value) {
if (!firemap.has(key)) {
firemap.set(key, []);
}
firemap.get(key).push(value);
}
function checking(arr) {
let flag;
for (let i = 0; i < arr.length; i++) {
if (i == 0) {
flag = arr[i] % 2;
continue;
}
if (flag != arr[i] % 2) {
return 0;
}
}
return 1;
}
function convertpos(pos) {
if (pos <= N && pos >= 0) {
if (pos === 0) return N;
return pos;
} else if (pos > N) {
if (pos % N === 0) return N;
return pos % N;
} else if (pos < 0) {
return N + (pos % N);
}
}
for (let i = 0; i < K; i++) {
for (let j = 0; j < fireballs.length; j++) {
let direc = fireballs[j].d;
let ds = fireballs[j].s;
let sx = fireballs[j].c + ds * dx[direc];
let sy = fireballs[j].r + ds * dy[direc];
sx = convertpos(sx);
sy = convertpos(sy);
fireballs[j].c = sx;
fireballs[j].r = sy;
addValueToMap(`${sx}_${sy}`, fireballs[j]);
}
fireballs = [];
for (let key of firemap) {
let arr = firemap.get(key);
let sumM = 0;
let sumS = 0;
if (arr.length >= 2) {
let direcs = [];
for (let i = 0; i < arr.length; i++) {
sumS += arr[i].s;
sumM += arr[i].m;
direcs.push(arr[i].d);
}
sumM = Math.trunc((sumM /= 5));
sumS = Math.trunc(sumS / arr.length);
if (sumM === 0) {
continue;
}
if (checking(direcs)) {
for (let i = 0; i <= 6; i += 2) {
fireballs.push({ r: arr[0].r, c: arr[0].c, m: sumM, s: sumS, d: i });
}
} else {
for (let i = 1; i <= 7; i += 2) {
fireballs.push({ r: arr[0].r, c: arr[0].c, m: sumM, s: sumS, d: i });
}
}
} else {
fireballs.push(...arr);
}
}
firemap.clear();
}
let ans = 0;
for (let i = 0; i < fireballs.length; i++) {
ans += fireballs[i].m;
}
console.log(ans);
반응형
'백준 문제풀이 > Nodejs' 카테고리의 다른 글
[백준][dp] 2225 합분해 NodeJs 구현 (1) | 2024.10.19 |
---|---|
[백준][구현] 20057 마법사 상어와 토네이도 NodeJs 구현 (0) | 2024.10.18 |
[백준][dfs / bfs] 1260 DFS와 BFS NodeJs구현 (0) | 2024.10.14 |
[백준][백트래킹] 15650 N과 M NodeJs 구현 (1) | 2024.10.14 |
[백준][정렬] 11651 좌표 정렬하기2 NodeJs 구현 (0) | 2024.10.11 |