문제 설명
빙하가 깨지면서 스노우타운에 떠내려 온 "죠르디"는 인생 2막을 위해 주택 건축사업에 뛰어들기로 결심하였습니다. "죠르디"는 기둥과 보를 이용하여 벽면 구조물을 자동으로 세우는 로봇을 개발할 계획인데, 그에 앞서 로봇의 동작을 시뮬레이션 할 수 있는 프로그램을 만들고 있습니다.
프로그램은 2차원 가상 벽면에 기둥과 보를 이용한 구조물을 설치할 수 있는데, 기둥과 보는 길이가 1인 선분으로 표현되며 다음과 같은 규칙을 가지고 있습니다.
기둥은 바닥 위에 있거나 보의 한쪽 끝 부분 위에 있거나, 또는 다른 기둥 위에 있어야 합니다.
보는 한쪽 끝 부분이 기둥 위에 있거나, 또는 양쪽 끝 부분이 다른 보와 동시에 연결되어 있어야 합니다.
단, 바닥은 벽면의 맨 아래 지면을 말합니다.
벽면의 크기 n, 기둥과 보를 설치하거나 삭제하는 작업이 순서대로 담긴 2차원 배열 build_frame이 매개변수로 주어질 때, 모든 명령어를 수행한 후 구조물의 상태를 return 하도록 solution 함수를 완성해주세요.
다른 알고리즘을 사용하는것이 아닌 구현문제.
0이하로 떨어지는 값과 n이상의 값을 편하게 처리하기위해 기존 크기에 +2를 더한 boolean을 생성하는것이 좋다.
생성로직은 문제에 맞게 구현하면 되고 삭제로직은 생성로직의 역으로 삭제한뒤 영향이 가는 보와 기둥에 대해 체크를 해주면 된다.
코드
import java.util.*;
class Solution {
public int[][] solution(int n, int[][] build_frame) {
boolean[][] beam =new boolean[n+3][n+3];
boolean[][] pillar =new boolean[n+3][n+3];
ArrayList<int[]> list = new ArrayList<>();
for(int[] build: build_frame){
int x = build[0]+1;
int y = build[1]+1;
switch(build[3]){
case 1: //생성
if(build[2]==1){//보 생성
if(checkBeam(x,y,beam,pillar)){
beam[x][y]=true;
}
}else{//기둥 생성
if(checkPillar(x,y,beam,pillar)){
pillar[x][y]=true;
}
}
break;
case 0://삭제
if(build[2]==1){//보 삭제
beam[x][y]=false;
if(!deleteBeam(x,y,beam,pillar)){
beam[x][y]=true;
}
}else{//기둥 삭제
pillar[x][y]=false;
if(!deletePillar(x,y,beam,pillar)){
pillar[x][y]=true;
}
}
break;
}
}
for(int i = 1; i <= n+1; ++i) {
for(int j = 1; j <= n+1; ++j) {
if(pillar[i][j]) {
list.add(new int[] {i-1, j-1, 0});
}
if(beam[i][j]) {
list.add(new int[] {i-1, j-1, 1});
}
}
}
//결과를 배열로 변경
int[][] answer = new int[list.size()][3];
for(int i = 0; i < answer.length; i++) {
answer[i][0] = list.get(i)[0];
answer[i][1] = list.get(i)[1];
answer[i][2] = list.get(i)[2];
}
return answer;
}
public boolean checkBeam(int x,int y,boolean[][] beam,boolean[][] pillar){
if(pillar[x][y-1]||pillar[x+1][y-1])return true;
else if(beam[x+1][y]&&beam[x-1][y])return true;
return false;
}
public boolean checkPillar(int x,int y,boolean[][] beam,boolean[][] pillar){
if(y==1)return true;
else if(pillar[x][y-1])return true;
else if(beam[x][y]||beam[x-1][y])return true;
return false;
}
public boolean deleteBeam(int x,int y,boolean[][] beam,boolean[][] pillar){
if(pillar[x][y] && !checkPillar(x,y,beam,pillar)) return false;
if(pillar[x+1][y] && !checkPillar(x+1,y,beam,pillar)) return false;
if(beam[x-1][y] && !checkBeam(x-1,y,beam,pillar)) return false;
if(beam[x+1][y] && !checkBeam(x+1,y,beam,pillar)) return false;
return true;
}
public boolean deletePillar(int x,int y,boolean[][] beam,boolean[][] pillar){
if(pillar[x][y+1] && !checkPillar(x,y+1,beam,pillar)) return false;
if(beam[x][y+1] && !checkBeam(x,y+1,beam,pillar)) return false;
if(beam[x-1][y+1] && !checkBeam(x-1,y+1,beam,pillar)) return false;
return true;
}
}