문제
풀이
지문을 잘 이해하고 그대로 구현하면 되는 구현 문제인데..
문제를 잘못 이해한 뒤 풀고 깨닫고 지우고 다시 풀고를 반복하니까 스트레스가 장난 아니었다
x * y의 2차원 배열을 바탕으로 원소 안에 다시 2개의 인덱스를 초기화 해서 총 3차원의 배열을 만들어서 보와 기둥을 표시해도 되고
객체를 만들어도 되고 보와 기둥의 배열을 각각 만들어도 된다
이렇게 초기화 했으면 주어진 값을 돌리면서 해당 조건에 설치하고 삭제하면 끝
코드
function solution(n, build_frame) {
var answer = [];
let pillar = [];
let beam = [];
for (let i = 0; i <= n + 1; i++) {
pillar.push(Array(n + 2).fill(0));
beam.push(Array(n + 2).fill(0));
}
while (build_frame.length) {
let [x, y, a, b] = build_frame.shift();
x++;
y++;
if (a === 0) {
if (b === 1) {
if (checkP(pillar, beam, [x, y])) {
pillar[y][x] = 1;
}
} else {
let flag = true;
pillar[y][x] = 0;
if (pillar[y + 1][x] === 1 && !checkP(pillar, beam, [x, y + 1])) {
flag = false;
} else if (beam[y + 1][x] && !checkB(pillar, beam, [x, y + 1])) {
flag = false;
} else if (
beam[y + 1][x - 1] &&
!checkB(pillar, beam, [x - 1, y + 1])
) {
flag = false;
}
if (!flag) pillar[y][x] = 1;
}
} else {
if (b === 1) {
if (checkB(pillar, beam, [x, y])) {
beam[y][x] = 1;
}
} else {
let flag = true;
beam[y][x] = 0;
if (pillar[y][x + 1] === 1 && !checkP(pillar, beam, [x + 1, y])) {
flag = false;
} else if (pillar[y][x] === 1 && !checkP(pillar, beam, [x, y])) {
flag = false;
} else if (
beam[y][x + 1] === 1 &&
!checkB(pillar, beam, [x + 1, y])
) {
flag = false;
} else if (
beam[y][x - 1] === 1 &&
!checkB(pillar, beam, [x - 1, y])
) {
flag = false;
}
if (!flag) beam[y][x] = 1;
}
}
}
for (let i = 1; i < n + 2; i++) {
for (let j = 1; j < n + 2; j++) {
if (pillar[i][j] === 1) {
answer.push([j - 1, i - 1, 0]);
}
if (beam[i][j] === 1) {
answer.push([j - 1, i - 1, 1]);
}
}
}
answer.sort((a, b) =>{
return (a[0]!==b[0]) ? a[0]-b[0] : ((a[1]!==b[1]) ? a[1]-b[1] : a[2]-b[2]);
});
return answer;
}
function checkP(pillar, beam, frame) {
let [x, y] = frame;
if (y === 1) return true;
if (beam[y][x - 1] === 1) return true;
if (pillar[y - 1][x] === 1) return true;
if (beam[y][x] === 1) return true;
return false;
}
function checkB(pillar, beam, frame) {
let [x, y] = frame;
if (pillar[y - 1][x] === 1) return true;
if (pillar[y - 1][x + 1] === 1) return true;
if (beam[y][x - 1] === 1 && beam[y][x + 1] === 1) return true;
return false;
}
'Algorithm > 문제' 카테고리의 다른 글
programmers. 외벽 점검 (0) | 2021.05.28 |
---|---|
baekjoon. 괄호의 값 (0) | 2021.05.26 |
programmers. 광고 삽입 (0) | 2021.05.05 |
programmers. 길 찾기 게임 (0) | 2021.05.04 |
programmers. 합승 택시 요금 (0) | 2021.05.02 |