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
문제 간단 설명
각 면에 숫자를 가진 주사위가 보드를 이동하며 숫자들을 변경합니다. 이 때 주사위가 이동할 때마다 주사위의 상단에 있는 숫자를 출력해야합니다.
문제 풀이
특별한 알고리즘이 필요한 문제는 아니었습니다. 주사위의 이동을 어떻게 표현할지 생각할 수 있다면 풀 수 있는 백준의 골드 난이도 치고는 쉬운 문제라고 생각합니다.
코드
package com.baekjoon.gold;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main_BJ_14499_G4_주사위굴리기 {
static int N, M, y, x, K; //보드 크기 N, M / 시작 주사위 좌표 y, x / 명령어 개수 K
static int[][] board; //바닥을 표현해 줄 board
static int[] dy = {0, 0, 0, -1, 1}; //주사위의 이동을 표현해줄 dy, dx
static int[] dx = {0, 1, -1, 0, 0};
static int[] dice; //주사위의 각 면의 숫자들을 표현해 줄 dice
public static void main(String[] args) throws Exception{
//주어진 입력값들을 입력 받습니다.
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
y = Integer.parseInt(st.nextToken());
x = Integer.parseInt(st.nextToken());
K = Integer.parseInt(st.nextToken());
board = new int[N][M];
dice = new int[] {0, 0, 0, 0, 0, 0, 0};
for (int i = 0; i < N; i++) {
st = new StringTokenizer(br.readLine());
for (int j = 0; j < M; j++) {
int val = Integer.parseInt(st.nextToken());
board[i][j] = val;
}
}
st = new StringTokenizer(br.readLine());
StringBuilder sb = new StringBuilder();
//명령어들을 하나씩 받아내며 주사위의 이동을 표현해줍니다.
for (int i = 0; i < K; i++) {
//명령어를 하나 받습니다.
int k = Integer.parseInt(st.nextToken());
//명령어에 맞는 방향으로 다음 방향을 미리 가봅니다.
int ny = y + dy[k];
int nx = x + dx[k];
//만약 보드의 범위를 벗어나지 않는다면 주사위의 이동을 합니다.
if(0<=ny && ny<N && 0<=nx && nx<M) {
//주사위를 이동시켜줍니다.
y = ny;
x = nx;
if(k==1) { // 동쪽이라면
//주사위가 굴러서 이동하며 변경되는 수 들을 표현해주었습니다.
dice = new int[]{dice[0], dice[3], dice[2], dice[6], dice[1], dice[5], dice[4]};
//문제에서 주어진 조건에 따라서 보드의 바닥이 0일라면 주사위 바닥인 dice[1]을 바닥에 복사해줍니다.
if(board[y][x] == 0) board[y][x] = dice[1];
else { //보드의 바닥이 0이 아니라면 주사위의 바닥인 dice[1]에 보드의 숫자를 붙여준 뒤 보드의 수는 0으로 만들어줍니다.
dice[1] = board[y][x];
board[y][x] = 0;
}
// 아래부터는 위와 같은 방식을 방향별로 표현해줍니다.
} else if(k==2) { //서쪽이라면
dice = new int[]{dice[0], dice[4], dice[2], dice[1], dice[6], dice[5], dice[3]};
if(board[y][x] == 0) board[y][x] = dice[1];
else {
dice[1] = board[y][x];
board[y][x] = 0;
}
} else if(k==3) { //북쪽이라면
dice = new int[]{dice[0], dice[2], dice[6], dice[3], dice[4], dice[1], dice[5]};
if(board[y][x] == 0) board[y][x] = dice[1];
else {
dice[1] = board[y][x];
board[y][x] = 0;
}
} else { //남쪽이라면
dice = new int[]{dice[0], dice[5], dice[1], dice[3], dice[4], dice[6], dice[2]};
if(board[y][x] == 0) board[y][x] = dice[1];
else {
dice[1] = board[y][x];
board[y][x] = 0;
}
}
//이동이 끝난 뒤 주시위의 상단인 dice[6]을 StringBuilder에 입력해줍니다.
sb.append(dice[6]+"\n");
} else { // 발판을 넘어가는 명령은 무시합니다.
continue;
}
}
//결과적으로 만들어진 StringBuilder를 출력해줍니다.
System.out.println(sb.toString().trim());
}
}
'Coding Test > Baekjoon' 카테고리의 다른 글
[백준] 14888 연산자 끼워넣기, java (0) | 2023.04.04 |
---|---|
[백준] 14503 로봇 청소기, java (0) | 2023.04.03 |
[백준] 2096 내려가기, java (0) | 2022.12.19 |
[백준] 9019 DSLR, java (0) | 2022.12.14 |
[백준] 7569 토마토, java (0) | 2022.12.12 |