반응형
풀이
풀이에 앞서 최근에 코테를 봤는데 이 문제 비슷한게 나왔습니다.
처음으로 코테를 가서 풀어서 다른 사람 키보드 때문에 멘탈도 살살 털리구 집중을 못했네요 ㅜㅜ
핵심은 dice 리스트에
바닥 동 서 남 북 위 순으로 현재 값을 계속 바꿔주면서 담아주는 방법을 쓰겠습니다.
하나를 예로 들자면,
동쪽으로 굴리자면
바닥에 있던 0번째 인덱스 값이 서쪽으로 가서 2번째로,
동쪽에 있던 1번째 인덱스 값이 바닥으로 가서 0번째로,
서쪽에 있던 2번째 인덱스 값이 위쪽으로 가서 5번째로,
남쪽에 있던 3번째 인덱스 값은 그대로
북쪽에 있던 4번째 인덱스 값도 그대로,
마지막으로
위쪽에 있던 5번째 인덱스 값은 동으로 이동하게 됩니다.
나머지 서 남 북으로 이동할 때에 맞춰 인덱스 값을 변경해주고
현재 위치에 맵 값과 주사위 바닥면을 비교하면 윗면을 출력해주면 됩니다.
import java.io.*;
import java.util.*;
public class Main_14999_주사위굴리기 {
static int N,M,cur_x,cur_y, cmd;
// 바닥 우 좌 하 상 위
static int[] dice;
static int[][] map;
// 동서 북 남
static int[] dx = {0,0,-1,1};
static int[] dy = {1,-1,0,0};
public static void main(String[] args) throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine()," ");
StringBuilder sb = new StringBuilder();
N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
cur_x = Integer.parseInt(st.nextToken());
cur_y = Integer.parseInt(st.nextToken());
dice = new int[6];
Integer.parseInt(st.nextToken());
map = new int[N][M];
for(int i = 0 ; i<N ; i++) {
st = new StringTokenizer(br.readLine(), " ");
for(int j = 0 ; j<M ; j++) {
map[i][j] =Integer.parseInt(st.nextToken());
}
}
st = new StringTokenizer(br.readLine(), " ");
while(st.countTokens()!=0) {
// 1 동 2 서 3 남 4 북
cmd = Integer.parseInt(st.nextToken());
if(can_roll(cmd)) {
roll(cmd);
if(map[cur_x][cur_y]!=0) {
dice[0] =map[cur_x][cur_y];
map[cur_x][cur_y] = 0;
}
// 이동한 칸에 수가0일
else {
map[cur_x][cur_y]=dice[0];
}
sb.append(dice[5]).append("\n");
}
}
System.out.println(sb);
br.close();
}
private static boolean can_roll(int cmd) {
// TODO Auto-generated method stub
int nx = cur_x + dx[cmd-1];
int ny = cur_y + dy[cmd-1];
if (0>nx || nx>= N || 0>ny || ny>= M) return false;
cur_x = nx;
cur_y = ny;
return true;
}
private static void roll(int cmd) {
// TODO Auto-generated method stub
// 1 동 2 서 3 남 4 북
int[] tmp = new int[6];
for(int i=0; i<6; i++) {
tmp[i] = dice[i];
}
if(cmd == 1) {
dice[0]=tmp[1];
dice[1]=tmp[5];
dice[2]=tmp[0];
dice[3]=tmp[3];
dice[4]=tmp[4];
dice[5]=tmp[2];
}else if(cmd ==2) {
dice[0]=tmp[2];
dice[1]=tmp[0];
dice[2]=tmp[5];
dice[3]=tmp[3];
dice[4]=tmp[4];
dice[5]=tmp[1];
}else if(cmd ==3) {
dice[0]=tmp[4];
dice[1]=tmp[1];
dice[2]=tmp[2];
dice[3]=tmp[0];
dice[4]=tmp[5];
dice[5]=tmp[3];
}else if(cmd ==4) {
dice[0]=tmp[3];
dice[1]=tmp[1];
dice[2]=tmp[2];
dice[3]=tmp[5];
dice[4]=tmp[0];
dice[5]=tmp[4];
}
}
}
풀었던 문제들을 꼼꼼히 복습합시다 !!
반응형
'알고리즘 > 문제 풀이' 카테고리의 다른 글
[Java/자바 백준 21610] 마법사 상어와 비바라기 (0) | 2021.11.10 |
---|---|
[Java/자바 백준 16234] 인구이동 (0) | 2021.11.09 |
[Java/자바 백준 17140] 이차원 배열과 연산 (0) | 2021.10.17 |
[Java/자바 swea 5648] 원자 소멸 시뮬레이션 (0) | 2021.10.13 |
[Java/자바 swea 5653] 줄기세포배양 (0) | 2021.10.11 |