개발새발 로그

[JS] 백준 14499번 : 주사위 굴리기 본문

알고리즘

[JS] 백준 14499번 : 주사위 굴리기

이즈흐 2023. 7. 2. 17:11

https://www.acmicpc.net/problem/14499

 

14499번: 주사위 굴리기

첫째 줄에 지도의 세로 크기 N, 가로 크기 M (1 ≤ N, M ≤ 20), 주사위를 놓은 곳의 좌표 x, y(0 ≤ x ≤ N-1, 0 ≤ y ≤ M-1), 그리고 명령의 개수 K (1 ≤ K ≤ 1,000)가 주어진다. 둘째 줄부터 N개의 줄에 지

www.acmicpc.net

 

 

📋풀이방법

1.  가로와 세로 부분, 그리고 가로와세로가 겹치는 윗 부분과 아랫부분을 각각 배열 과 상수로 변수에 저장한다.

  -이유는 주사위가 계속 굴러갈 때 윗 부분과 아랫부분은 어디에 속해있지않고 계속해서 바뀐다.

  -하지만 동쪽과 서쪽, 북쪽과 남쪽부분은 굴려도 어디에 영향을 받지 않고 윗부분의 숫자와 아랫부분의 숫자로 정해진다.

2. 이를 통해 문제에서 주어진 구르는 명령을 구분해서 각각 top과 floor <-> NS 혹은 WE 배열의 값들을 서로 바꾸면 된다.

3. 이때 각각 명령에 따라 서로 바꾸고 난 뒤 지도의 x,y부분이 0이면 floor값으로 바꿔주고,

4. x,y부분이 0이 아니면 floor의 값을 다시 x,y에 있는 값으로 바꾸고 x,y는 0으로 바꿔야한다.

 

 

🤟내 제출

const fs = require("fs");
const filePath = process.platform === "linux" ? "/dev/stdin" : "./input.txt";
let input = fs.readFileSync(filePath).toString().trim();
input=input.replace(/\r/g,"").split("\n");

let t_arr=input.shift().split(" ").map(Number);
let N=t_arr[0];
let M=t_arr[1];
let [x,y]= [t_arr[2],t_arr[3]];
let K=t_arr[4];


let arr=[];
for(var i=0;i<N;i++){
    arr.push(input.shift().split(" ").map(Number));
}

let go=input.shift().split(" ").map(Number)

let WE=[0,0];
let NS=[0,0];
let floor=0;
let top=0;
let answer=[];

go.forEach((cir)=>{
    if(cir==1 && y+1<M){
        y++;
        let [temp_top,temp_floor]=[top,floor];
        top=WE[1];
        floor=WE[0];
        [WE[0],WE[1]]= [temp_top,temp_floor];
        if(arr[x][y]==0) arr[x][y]=floor;
        else {
            floor=arr[x][y];
            arr[x][y]=0;
        }
        answer.push(top);
    }
    else if(cir==2 && y-1>=0){
        y--;
        let [temp_top,temp_floor]=[top,floor];
        top=WE[0];
        floor=WE[1];
        [WE[1],WE[0]]= [temp_top,temp_floor];
        if(arr[x][y]==0) arr[x][y]=floor;
        else {
            floor=arr[x][y];
            arr[x][y]=0;
        }
        answer.push(top);
    }
    else if(cir==3 && x-1>=0){
        x--;
        let [temp_top,temp_floor]=[top,floor];
        top=NS[1];
        floor=NS[0];
        [NS[0],NS[1]]= [temp_top,temp_floor];
        if(arr[x][y]==0) arr[x][y]=floor;
        else {
            floor=arr[x][y];
            arr[x][y]=0;
        }
        answer.push(top);
    }
    else if(cir==4 && x+1<N){
        x++
        let [temp_top,temp_floor]=[top,floor];
        top=NS[0];
        floor=NS[1];
        [NS[1],NS[0]]= [temp_top,temp_floor];
        if(arr[x][y]==0) arr[x][y]=floor;
        else {
            floor=arr[x][y];
            arr[x][y]=0;
        }
        answer.push(top);
    }
});
console.log(answer.join("\n"));

 

 

💢어려웠던 이유

1. 풀이방법은 빠르게 접근했고, 풀이도 완성했지만 문제의 조건인 x,y부분이 0일때의 조건을 생각하지 않았다.

 -이를 수정하는 과정에서 floor 값은 일단 NS혹은 WE의 값중 하나로 저장해놓고 0일때의 조건을 생각해야했는데 그 코드를 추가하지 않았다.

728x90
반응형
LIST

'알고리즘' 카테고리의 다른 글

[JS] 백준 13460번 : 구술 탈출 2  (0) 2023.07.04
[JS] 백준 16234번 : 인구이동  (0) 2023.07.03
[JS] 백준 16236 : 아기상어  (0) 2023.07.01
[JS] 백준 3190번 : 뱀  (0) 2023.06.30
[JS] 백준 5430번 : AC  (0) 2023.06.29