백준 14499번 - 주사위 굴리기

2020. 12. 27. 22:42· Koala - 1기
목차
  1. 백준 14499번 - 주사위 굴리기

백준 14499번 - 주사위 굴리기

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

 

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

 

이 문제는 시뮬레이션 문제이다.

주사위를 지도 안에서 굴리면서 윗면(바닥 면과 반대되는 면)을 출력하는 문제이다. 

조건은 다음과 같다.

 

  1. 주사위를 굴렸을 때, 이동한 칸에 쓰여있는 수가 0이면, 주사위의 바닥면에 쓰여 있는 수가 칸에 복사된다.
  2. 0 이 아닌 경우에는 칸에 쓰여 있는 수가 주사위의 바닥면으로 복사되며, 칸에 쓰여 있는 수는 0이 된다.
  3. 주사위는 지도 바깥으로 이동 불가하며 입력이 들어올 시 해당 입력 무시 및 출력 X

풀이법은 각 이동마다 주사위의 모든 면을 갱신시켜주는 것이 핵심이였다.

구현은 switch문을 통해 동, 서, 남, 북 이동시마다 주사위의 숫자들을 갱신시켰다.

방법은 예를 들어 동쪽으로 이동 시 (바닥면 기준 동,서,남,북 면으로 표현하였다)

 

바닥면 -> 기존 바닥면의 동쪽 면

윗면 -> 기존 바닥면의 서쪽 면

동쪽 면 -> 기존 바닥면의 윗 면

서쪽면 -> 기존 바닥면

남쪽 면 -> 기존 남쪽면

북쪽 면 -> 기존 북쪽면

 

이렇게 동, 서, 남, 북으로 이동 시 바뀌는 면들을 코드로 구현하였다.

처음에 문제에서 동, 서, 북, 남 순으로 제시했는데 잘못 읽어서 동, 서, 남, 북으로 표현했다가 시간을 낭비했다.

그리고 질문 검색판을 읽어보니 대부분의 틀린 사람들이 입력 받을 때 x,y를 반대로 입력 받지 않아서 틀렸다고 하던데

나는 처음부터 행렬로 생각하고 풀었기 때문에 x, y 입력에는 문제가 없었다.

(왜 y,x로 입력받아야 되는지 아직도 모르겠음 ㅎㅎ..)

 

코드는 다음과 같다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#include <iostream>
#include <vector>
#pragma warning(disable:4996)
using namespace std;
int map[21][21];
int dx[4] = { 0,0, -1, 1 };
int dy[4] = { 1,-1,0,0 };
 
int main() {
    int n, m, x, y, k;
    scanf("%d %d %d %d %d", &n, &m, &x, &y, &k);
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            scanf("%d", &map[i][j]);
        }
    }
    vector<int>move(k);
    for (int i = 0; i < k; i++) {
        scanf("%d", &move[i]);
    }
    int cen = 0, north = 0, south = 0, east = 0, west = 0, top = 0;
    int nx = x, ny = y;
    for (int i = 0; i < k; i++) {
        int now = move[i];
        nx = nx + dx[now - 1];
        ny = ny + dy[now - 1];
        if (nx < 0 || nx >= n || ny < 0 || ny >= m) {
            nx = nx - dx[now - 1];
            ny = ny - dy[now - 1];
            continue;
        }
        int prev_cen = cen, prev_north = north, prev_south = south;
        int prev_east = east, prev_west = west, prev_top = top;
        switch (now) {
            case 1:
                cen = prev_east;
                west = prev_cen;
                east = prev_top;
                top = prev_west;
                break;
            case 2:
                cen = prev_west;
                west = prev_top;
                east = prev_cen;
                top = prev_east;
                break;
            case 3:
                cen = prev_north;
                north = prev_top;
                south = prev_cen;
                top = prev_south;
                break;
            case 4:
                cen = prev_south;
                north = prev_cen;
                south = prev_top;
                top = prev_north;
                break;
        }
        if (map[nx][ny] == 0) map[nx][ny] = cen;
        else {
            cen = map[nx][ny];
            map[nx][ny] = 0;
        }
        printf("%d\n", top);
    }
}
Colored by Color Scripter
cs

 

동, 서, 남, 북으로 이동 했을 때의 각 면의 숫자들의 변화만 잘 생각해서 짜면 쉽게 풀 수 있을 것이다.

'Koala - 1기' 카테고리의 다른 글

LCS 알고리즘이란?  (0) 2020.12.27
문자열 - KMP 알고리즘  (0) 2020.12.27
2015~2019 ACM - ICPC 문제별 알고리즘(골드1 ~ 플래, 다이아)  (0) 2020.12.27
알고리즘(Algorithm)이란?  (0) 2020.12.27
휴리스틱 알고리즘(Heuristic Algorithm)  (1) 2020.12.27
  1. 백준 14499번 - 주사위 굴리기
'Koala - 1기' 카테고리의 다른 글
  • LCS 알고리즘이란?
  • 문자열 - KMP 알고리즘
  • 2015~2019 ACM - ICPC 문제별 알고리즘(골드1 ~ 플래, 다이아)
  • 알고리즘(Algorithm)이란?
KauKoala
KauKoala
항공대 알고리즘 동아리 Koala 🥰
Koala항공대 알고리즘 동아리 Koala 🥰
KauKoala
Koala
KauKoala
전체
오늘
어제
  • 분류 전체보기 (1888)
    • 공지 게시판 (10)
    • 정보 게시판 (8)
    • Codeforce (15)
    • acm-icpc (6)
    • Koala - 1기 (16)
    • Koala - 2기 (111)
      • Programming Contest (1)
      • A반 (20)
      • B반 (39)
      • C반 (22)
      • 기초 강의 (18)
    • Koala - 3기 (10)
      • 기초 스터디 (7)
    • Koala - 4기 (67)
    • Koala - 5기 (144)
      • 기초 알고리즘 스터디 (75)
      • 코딩테스트 준비 스터디 (68)
    • Koala - 6기 (102)
      • 기초 알고리즘 스터디 (75)
      • 코딩테스트 준비 스터디 (25)
      • 모의 테스트 스터디 (1)
    • Koala - 7기 (167)
      • 기초 알고리즘 스터디 (97)
      • 코딩테스트 준비 스터디 (68)
      • 모의 테스트 스터디 (1)
    • Koala - 8기 (44)
      • 기초 알고리즘 스터디 (32)
      • 코딩테스트 준비 스터디 (10)
      • 코드포스 버츄얼 스터디 (0)
      • 프로그래머스 LV2 스터디 (0)
    • Koala - 9기 (205)
      • 기초 알고리즘 스터디 (138)
      • 코딩테스트 준비 스터디 (64)
      • 모의테스트 준비 스터디 (1)
    • Koala - 10기 (117)
      • 기초 알고리즘 스터디 (30)
      • 코딩테스트 준비 스터디 (86)
      • 모의테스트 준비 스터디 (1)
    • Koala - 11기 (151)
      • 기초 알고리즘 스터디 (46)
      • 코딩테스트 준비 스터디 (104)
      • 모의테스트 준비 스터디 (1)
    • Koala - 12기 (86)
      • 기초 알고리즘 스터디 (31)
      • 코딩테스트 준비 스터디 (55)
    • Koala - 13기 (119)
      • 기초 알고리즘 스터디 (52)
      • 코딩테스트 준비 스터디 (67)
    • Koala - 14기 (116)
      • 기초 알고리즘 스터디 (39)
      • 코딩테스트 준비 스터디 (77)
    • Koala - 15기 (138)
      • 기초 알고리즘 스터디 (73)
      • 코딩테스트 준비 스터디 (65)
    • Koala - 16기 (47)
      • 코딩테스트 기초 스터디 (16)
      • 코딩테스트 심화 스터디 (31)
    • Koala - 17기 (62)
      • 코딩테스트 기초 스터디 (15)
      • 코딩테스트 심화 스터디 (47)
    • Koala - 18기 (31)
      • 코딩테스트 기초 스터디 (11)
      • 코딩테스트 심화 스터디 (20)
    • Koala - 19기 (42)
      • 코딩테스트 기초 스터디 (7)
      • 코딩테스트 심화 스터디 (35)
    • Koala - 20기 (0)
      • 코딩테스트 기초 스터디 (0)
      • 코딩테스트 심화 스터디 (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

  • 🐨항공대 알고리즘 학회 Koala 3기 모집
  • 🐨항공대 알고리즘 학회 Koala 2기 모집
  • 소모임 소개

인기 글

태그

  • BFS
  • 파이썬
  • dfs
  • dp
  • BOJ
  • 백트래킹
  • C++
  • 백준

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.3.0
KauKoala
백준 14499번 - 주사위 굴리기
상단으로

티스토리툴바

단축키

내 블로그

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

블로그 게시글

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

모든 영역

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

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