기둥과 보 설치

Lee1231234·2023년 4월 24일

코딩테스트

목록 보기
42/95

문제 설명
빙하가 깨지면서 스노우타운에 떠내려 온 "죠르디"는 인생 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;
    }
}
profile
not null

0개의 댓글