https://www.acmicpc.net/problem/14499
문제 설명
- 가장 처음에 주사위에는 모든 면에 0이 적혀져 있다.
- 지도의 각 칸에는 정수가 쓰여져 있다.
- 이동한 칸에 쓰여 있는 수가 0이면, 주사위의 바닥면에 쓰여 있는 수가 복사된다.
- 0이 아닌 경우에는 칸에 쓰여 있는 수가 주사위의 바닥면에 복사된다. 칸에 쓰여 있는 수가 0이 된다.
- 이동 시키는 명령어 동쪽은 1, 서쪽은 2, 북쪽은 3, 남쪽은 4이다!!
문제에 대한 아이디어
문제를 읽고 느낀점은 이렇게 움직이는 주사위를 어떻게 표현해야 할까 였다.
크기가 6인 배열을 구현해 주사위가 움직일 때 마다 배열을 바꿔줄까??
- 인덱스를 모두 생각해줘야 하니깐 너무 복잡해 보였다.
그래서 규칙을 찾아봤다.
규칙 찾기
- 북쪽으로 갈 때
top -> up, up -> bottom, bottom -> down, down -> top 을 간다.
- 남쪽으로 갈 때
top -> down, down -> bottom, bottom -> up, up -> top
- 서쪽으로 갈 때
top -> left, left -> bottom, bottom -> right, right -> top
- 동쪽으로 갈 때
top -> right, right -> bottom, bottom -> left, left -> top
위치 이동이 일어나면 무조건 주사위는 이렇게 변한다. 우리는 주사위의 모든 변화를 신경 써주는게 아니라 이동할 때 변경되는 것만 생각해주면 된다.
전체 코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class 백준_14499 {
//주사위의 정보를 저장하고 있는 class
static class dice{
int top; int up; int down; int left; int right; int bottom;
public dice(int top,int up, int down, int left, int right, int bottom){
this.top = top;
this.up = up;
this.down = down;
this.left = left;
this.right = right;
this.bottom = bottom;
}
}
static int pro[][]; //문제의 2차원 배열
static int dice[]; // 각 dice위치에 어떤 숫자가 있는지 저장
static int dx[] = {1,-1,0,0}; //동, 서 , 남 , 북
static int dy[] = {0,0,-1,1};
static int k = 0;
static int n = 0;
static int m = 0;
public static void main(String[] args) throws IOException {
BufferedReader buf = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(buf.readLine());
n = Integer.parseInt(st.nextToken());
m = Integer.parseInt(st.nextToken());
int startX = Integer.parseInt(st.nextToken());
int startY = Integer.parseInt(st.nextToken());
k = Integer.parseInt(st.nextToken());
pro= new int[n][m];
dice=new int[6];
for(int i = 0; i<n; ++i){
st = new StringTokenizer(buf.readLine());
for(int j = 0; j<m; ++j) {
pro[i][j] = Integer.parseInt(st.nextToken());
}
}
dice curDice = new dice(0,1,2,3,4,5); // 배열의 각 index가 위치이다.
int x = startX; int y = startY;
st = new StringTokenizer(buf.readLine());
//---여기까지가 입력 입력값 입력 받음
for(int i = 0; i< k; ++i){
int num = Integer.parseInt(st.nextToken());
dice nextDice = null; //다음 다이스
if(num == 1){ // 동
nextDice = new dice(curDice.left,curDice.up,curDice.down,curDice.bottom,curDice.top,curDice.right);
}
else if(num ==2){ // 서
nextDice = new dice(curDice.right, curDice.up, curDice.down, curDice.top, curDice.bottom, curDice.left);
}
else if(num ==3){ // 북
nextDice = new dice(curDice.up,curDice.bottom,curDice.top, curDice.left, curDice.right, curDice.down);
}
else if(num ==4){ // 남
nextDice = new dice(curDice.down, curDice.top,curDice.bottom,curDice.left,curDice.right,curDice.up);
}
//다음 위치
int nx = x + dx[num-1];
int ny = y + dy[num-1];
if(nx < 0 || nx >=m || ny < 0 || ny >= n) continue;
x = nx; y = ny; // 위치 이동
curDice = nextDice; //현재 다이스를 다음 다이스로 바꾼다.
if(pro[ny][nx] != 0){ //이동한 곳에 배열의 값이 0인지 0이 아닌지 판별
dice[nextDice.bottom] = pro[ny][nx];
pro[ny][nx] = 0;
System.out.println(dice[nextDice.top]);
}
else{
pro[ny][nx] = dice[nextDice.bottom];
System.out.println(dice[nextDice.top]);
}
}
}
}
'코딩테스트 공부 > 알고리즘 공부' 카테고리의 다른 글
합승 택시 요금(프로그래머스) JAVA (0) | 2023.03.25 |
---|---|
숫자 변환하기(프로그래머스) JAVA (0) | 2023.03.22 |
표 편집(프로그래머스) JAVA (0) | 2023.03.07 |
양과 늑대(프로그래머스) JAVA (0) | 2023.03.06 |
미로 탈출 명령어(프로그래머스) JAVA (0) | 2023.03.03 |