[백준](Java) 14499 - 주사위 굴리기
문제 링크
문제 풀이
문제를 읽다가 머리가 터지는줄 알았다. 주사위의 이동을 값들을 교체해 주는 방법으로 접근했다. 특히 x,y값의 범위설정이 조금 특이하게 되있었다. x값인데 범위가 세로값이었네..! 오우... 문제를 더 꼼꼼히 읽자...
문제를 해석하는데가 오래걸리고 구현은 금방 걸렸다.
모두 같은 로직을 사용했으므로 그중에 한가지만 놓고면
남쪽으로 이동하는 경우주사위를 위,아래,정면,뒤,우측, 좌측으로 놓고
우측, 좌측면의 숫자는 그대로이다.
정면 -> 아래, 아래 -> 뒤 , 뒤->위, 위-> 정면 으로 면 이동이 이루어진다.
이를 temp값들을 이용하여 교체해주었다.
이 과정에서 down(바닥면)의 값이 바뀌게 될때
valChange라는 메서드를 통해서 지도타일의 값을 판단하여 지도타일의 값을 복사하게 된다.public static void valChange(){ //지도의 값이 0이 아니면 down(바닥면)에 값을 복사하고, 지도의 값은 0으로 //지도의 값이 0이면 down(바닥면)에 있는 값을 지도에 복사한다. if(map[startx][starty]!=0){ down = map[startx][starty]; map[startx][starty]=0; }else{ map[startx][starty] = down; } }
switch 문에 들어가기전에 현재 위치에서 이동할수 있는지 판단하고 이동한다.
if(!(y + diry[pos - 1]>=0 && y + diry[pos - 1]<n && x + dirx[pos - 1]>=0 && x + dirx[pos - 1]<m)){ return; }
모든 과정에서 up(위면)의 값은 StringBuilder에 저장되고, 반복문 종료시에 출력한다.
코드
import java.util.*;
public class Main {
static int n;
static int m;
static int[][] map;
static int starty;
static int startx;
static StringBuilder sb = new StringBuilder();
/**
* 2
* 4 1 3
* 5
* 6
*/
static int up = 0; // 위 (1)
static int down = 0; // 아래 (6)
static int forward = 0; //정면 (5)
static int back = 0; //뒤 (2)
static int right = 0; //우측 (3)
static int left = 0; //좌측 (4)
//동 서 북 남
static int[] diry = {0, 0, -1, 1};
static int[] dirx = {1, -1, 0, 0};
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
m = sc.nextInt();
startx = sc.nextInt(); //세로
starty = sc.nextInt(); //가로
int num = sc.nextInt();
map = new int[n][m];
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
map[i][j] = sc.nextInt();
}
}
for (int i = 0; i < num; i++) {
roll(startx, starty, sc.nextInt());
}
System.out.print(sb);
}
public static void roll(int y, int x, int pos) {
//pos 동 서 북 남
if(!(y + diry[pos - 1]>=0 && y + diry[pos - 1]<n && x + dirx[pos - 1]>=0 && x + dirx[pos - 1]<m)){
return;
}
//이동
startx = y + diry[pos - 1];
starty = x + dirx[pos - 1];
int temp = 0;
int temp2 =0;
int temp3 =0;
switch (pos) {
//동 -> 우측
case 1:
//right -> down
temp = down;
down = right;
valChange();
//down -> left
temp2 = left;
left = temp;//down
//left -> up
temp3 = up;
up = temp2; //left
//up -> right
right = temp3;//up
//forward -> forward
//back -> back
break;
//서
case 2:
//forward -> forward
//back -> back
//left -> down
temp = down;
down = left;
valChange();
//down -> right
temp2 = right;
right = temp;
//right -> up
temp3 = up;
up = temp2;
//up -> left
left = temp3;
break;
//북
case 3:
//left -> left
//right -> right;
//back -> down
temp = down;
down = back;
valChange();
//down -> forward
temp2 = forward;
forward = temp;
//forward -> up
temp3 = up;
up = temp2;
//up -> back
back = temp3;
break;
//남
case 4:
//left -> left
//right -> right;
//forward -> down
temp = down;
down = forward;
valChange();
//down -> back
temp2 = back;
back = temp;
//back -> up
temp3 = up;
up = temp2;
//up -> forward
forward = temp3;
break;
}
sb.append(up+"\n");
}
public static void valChange(){
//지도의 값이 0이 아니면 down(바닥면)에 값을 복사하고, 지도의 값은 0으로
//지도의 값이 0이면 down(바닥면)에 있는 값을 지도에 복사한다.
if(map[startx][starty]!=0){
down = map[startx][starty];
map[startx][starty]=0;
}else{
map[startx][starty] = down;
}
}
}
Author And Source
이 문제에 관하여([백준](Java) 14499 - 주사위 굴리기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@courage331/백준Java-14499-주사위-굴리기저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)