전체 방문자
오늘
어제
모달조아
Better than yesterday
모달조아
  • 분류 전체보기 (147)
    • PS (86)
      • BOJ (79)
      • 프로그래머스 (6)
    • 이론 (41)
      • 자료구조 (2)
      • 알고리즘 (8)
      • 데이터베이스 (1)
      • 운영체제 (1)
      • 네트워크 (3)
      • 디자인패턴 (7)
      • Java (13)
      • Spring (4)
      • JPA (1)
      • Git (1)
    • 개발 (18)
    • 프로젝트 (1)
    • 기록 (0)
      • 후기 (0)
    • etc (1)

최근 글

티스토리

hELLO · Designed By 정상우.
모달조아
PS/BOJ

BOJ 14499 주사위 굴리기 [Java]

PS/BOJ

BOJ 14499 주사위 굴리기 [Java]

2022. 3. 19. 02:39

BOJ 14499 주사위 굴리기

1. 문제 링크

https://www.acmicpc.net/problem/14499

2. 문제 해설

구현 문제에서는 크게 어떤 기능을 구현해야할지를 우선적으로 생각하는 편이다.
하나의 명령의 흐름은 명령을 받으면 주사위를 굴리고 주어진 조건에 따라 값을 업데이트 해주는 것이다.
그러므로 구현해야할 기능은 크게 2가지이다. 첫번째는 주사위를 굴리는 메서드, 두번째는 주사위를 굴린 후 값을 업데이트 하는 메서드이다.

1. 주사위를 굴리는 메서드 - roll 메서드
주사위를 굴리는 건 노가다 방식으로 해결했다. 주사위 정보를 담고 있는 배열과 똑같은 배열을 하나 만들어준다. 그 후 이동하는 방향에 따라 바뀌는 주사위 정보를 바꿔준다.

2. 주사위를 굴린 후 값을 업데이트 하는 메서드 - update 메서드
문제에 적힌대로 주사위를 굴렸을 때, 이동한 칸에 쓰여 있는 수가 0이면 주사위의 바닥면에 쓰여 있는 수를 칸에 복사하고. 0이 아닌 경우에는 칸에 쓰여 있는 수를 주사위의 바닥면으로 복사한 후, 칸에 쓰여 있는 수를 0으로 만들어준다.

2가지 메서드를 구현하는 것은 어렵지 않았다.
이제 두 메서드를 이용해서 명령을 실행하는 solve 메서드를 구현해보자. 명령으로 방향값 dir 이 들어오면, 그 방향에 맞게 다음 위치 nr과 nc를 구해준다. 이때 만약 nr과 nc가 범위를 벗어나면 명령을 무시한다. nr과 nc를 구했으면 위 1, 2번 메서드를 이용하여 주사위를 굴려주고 값을 업데이트 해주면 된다.
명령이 한번만 들어오는 것이 아니라 k번 만큼 반복해줘야한다. 그러므로 nr과 nc를 현재 위치 x, y로 업데이트 해준다.

3. 코드 보기

import java.io.*;
import java.util.StringTokenizer;
public class Main {
static StringBuilder sb;
static int n, m, x, y, k;
static int[][] map;
static int[] cmd;
static int[] dice;
// 2
// 4 1 3
// 5
// 6
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st = new StringTokenizer(br.readLine());
sb = new StringBuilder();
n = Integer.parseInt(st.nextToken());
m = Integer.parseInt(st.nextToken());
x = Integer.parseInt(st.nextToken());
y = Integer.parseInt(st.nextToken());
k = Integer.parseInt(st.nextToken());
map = new int[n][m];
cmd = new int[k];
dice = new int[7];
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());
for (int i = 0; i < k; i++) {
cmd[i] = Integer.parseInt(st.nextToken());
solve(cmd[i]);
}
bw.write(sb.toString());
br.close();
bw.flush();
bw.close();
}
static void solve(int dir) {
int nr = x;
int nc = y;
if (dir == 1) { // 동쪽
nc++;
} else if (dir == 2) { // 서쪽
nc--;
} else if (dir == 3) { // 북쪽
nr--;
} else { // 남쪽
nr++;
}
if (nr < 0 || nc < 0 || nr >= n || nc >= m) { // 범위를 벗어나면 무시
return;
}
roll(dir); // 주사위 굴리기
// 현재 위치를 바꿔줌
x = nr;
y = nc;
update(nr, nc); // 값 업데이트
sb.append(dice[6]).append('\n');
}
static void roll(int dir) { // 주사위를 굴리는 메서드
int[] tmp = new int[7];
for (int i = 1; i < 7; i++) {
tmp[i] = dice[i];
}
if (dir == 1) { // 동
dice[1] = tmp[3];
dice[3] = tmp[6];
dice[4] = tmp[1];
dice[6] = tmp[4];
} else if (dir == 2) { // 서
dice[1] = tmp[4];
dice[3] = tmp[1];
dice[4] = tmp[6];
dice[6] = tmp[3];
} else if (dir == 3) { // 북
dice[1] = tmp[2];
dice[2] = tmp[6];
dice[5] = tmp[1];
dice[6] = tmp[5];
} else { // 남
dice[1] = tmp[5];
dice[2] = tmp[1];
dice[5] = tmp[6];
dice[6] = tmp[2];
}
}
static void update(int nr, int nc) { // 주사위를 굴린 후 주사위와 바닥 값을 업데이트하는 메서드
if (map[nr][nc] == 0) {
map[nr][nc] = dice[1];
} else {
dice[1] = map[nr][nc];
map[nr][nc] = 0;
}
}
}
저작자표시 (새창열림)

'PS > BOJ' 카테고리의 다른 글

BOJ 1939 중량제한 [Java]  (0) 2022.09.03
BOJ 15685 드래곤 커브 [Java]  (0) 2022.04.06
BOJ 14891 톱니바퀴 [Java]  (0) 2022.03.14
BOJ 2457 공주님의 정원 [Java]  (0) 2022.03.03
BOJ 9663 N-Queen [Java]  (0) 2022.02.13
  • BOJ 14499 주사위 굴리기
'PS/BOJ' 카테고리의 다른 글
  • BOJ 1939 중량제한 [Java]
  • BOJ 15685 드래곤 커브 [Java]
  • BOJ 14891 톱니바퀴 [Java]
  • BOJ 2457 공주님의 정원 [Java]
모달조아
모달조아

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.