반응형
- 알고리즘 분류 : 구현
- 사용 언어 : JAVA
- 문제 요점
- 주사위를 굴렸을 때, 이동한 칸에 쓰여 있는 수가 0이면, 주사위의 바닥면에 쓰여 있는 수가 칸에 복사된다.
- 0이 아닌 경우에는 칸에 쓰여 있는 수가 주사위의 바닥면으로 복사되며, 칸에 쓰여 있는 수는 0이 된다.
주사위 굴리는 것을 어떻게 구현해야 하나 고민 및 삽질 중 이해하는데 도움을 준 유튜브 링크를 공유합니다.
소스 설명은 주석을 참고해주세요.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
// https://www.acmicpc.net/problem/14499
public class Main {
// N : 지도의 세로, M : 지도의 가로
public static int N, M;
// x,y : 주사위 좌표
public static int x, y;
// K : 명령의 갯수
public static int K;
// 지도
public static int[][] map;
// 주사위 (처음엔 모든 면이 0)
public static int[] dice = new int[7];
public static void checkDice(char command) {
int moveY = 0;
int moveX = 0;
int[] tempDice = new int[7];
for(int i=1; i<dice.length; i++) {
tempDice[i] = dice[i];
}
// 동쪽(오른쪽)
if(command == '1') {
moveX = 1;
tempDice[6] = dice[4];
tempDice[3] = dice[2];
tempDice[4] = dice[3];
tempDice[2] = dice[6];
}
// 서쪽(왼쪽)
else if(command == '2') {
moveX = -1;
tempDice[6] = dice[2];
tempDice[2] = dice[3];
tempDice[3] = dice[4];
tempDice[4] = dice[6];
}
// 북쪽(위쪽)
else if(command == '3') {
moveY = -1;
tempDice[6] = dice[1];
tempDice[1] = dice[3];
tempDice[3] = dice[5];
tempDice[5] = dice[6];
}
// 남쪽(아래쪽)
else if(command == '4') {
moveY = 1;
tempDice[6] = dice[5];
tempDice[3] = dice[1];
tempDice[1] = dice[6];
tempDice[5] = dice[3];
}
int tempY = y+moveY;
int tempX = x+moveX;
// 범위 체크
if(tempX >= 0 && tempX < M && tempY >= 0 && tempY < N) {
int mapNum = map[tempY][tempX];
// 지도가 0이면 주사위 바닥면의 수가 지도로 복사
if(mapNum == 0) {
map[tempY][tempX] = tempDice[6];
}
// 지도가 0이 아니면 지도의 수가 주사위 바닥면으로 복사하고 지도는 0으로 변경
else {
tempDice[6] = mapNum;
map[tempY][tempX] = 0;
}
// tempDice의 내용을 dice로 옮기기
for(int i=0; i<dice.length; i++) {
dice[i] = tempDice[i];
}
x= tempX;
y= tempY;
System.out.println(dice[3]);
}
// 범위 벗어나면 무시
else {
return;
}
}
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
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());
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());
}
}
String commandStr = br.readLine();
// 1: 동쪽, 2: 서쪽, 3: 북쪽, 4: 남쪽
char[] commands = commandStr.replaceAll(" ", "").toCharArray();
for(int i=0; i<commands.length; i++) {
char command = commands[i];
checkDice(command);
}
}
}
반응형
'Algorithm' 카테고리의 다른 글
[BAEKJOON] 13460번 : 구슬 탈출2 (JAVA) (0) | 2022.05.15 |
---|---|
[BAEKJOON] 1012번 : 유기농배추 (JAVA) (0) | 2022.05.05 |
[BAEKJOON] 16236번 : 아기상어 (JAVA) (0) | 2022.04.25 |
[BAEKJOON] 14500번 : 테트리미노 (JAVA) (0) | 2022.04.15 |
[BAEKJOON] 17144번 : 미세먼지 안녕! (JAVA) (0) | 2022.04.14 |