혼자 정리

14496번: 주사위 굴리기 본문

알고리즘 문풀/백준

14496번: 주사위 굴리기

tbonelee 2021. 8. 3. 23:15

문제링크

C++ 처음 작성

#include <iostream>

using namespace std;

int N, M, x, y, K;

int map[20][20];

int dice[7];

void go_east()
{
    if (y + 1 >= M)
        return ;
    y += 1;
    int tmp;
    tmp = dice[4];
    dice[4] = dice[6];
    dice[6] = dice[3];
    dice[3] = dice[1];
    dice[1] = tmp;
    if (map[x][y] == 0) {
        map[x][y] = dice[6];
    }
    else {
        dice[6] = map[x][y];
        map[x][y] = 0;
    }
    cout << dice[1] << "\n";
}

void go_west()
{
    if (y - 1 <= -1)
        return ;
    y -= 1;
    int tmp;
    tmp = dice[4];
    dice[4] = dice[1];
    dice[1] = dice[3];
    dice[3] = dice[6];
    dice[6] = tmp;
    if (map[x][y] == 0) {
        map[x][y] = dice[6];
    }
    else {
        dice[6] = map[x][y];
        map[x][y] = 0;
    }
    cout << dice[1] << "\n";
}

void go_south()
{
    if (x + 1 >= N)
        return ;
    x += 1;
    int tmp;
    tmp = dice[5];
    dice[5] = dice[1];
    dice[1] = dice[2];
    dice[2] = dice[6];
    dice[6] = tmp;
    if (map[x][y] == 0) {
        map[x][y] = dice[6];
    }
    else {
        dice[6] = map[x][y];
        map[x][y] = 0;
    }
    cout << dice[1] << "\n";
}

void go_north()
{
    if (x - 1 <= -1)
        return ;
    x -= 1;
    int tmp;
    tmp = dice[5];
    dice[5] = dice[6];
    dice[6] = dice[2];
    dice[2] = dice[1];
    dice[1] = tmp;
    if (map[x][y] == 0) {
        map[x][y] = dice[6];
    }
    else {
        dice[6] = map[x][y];
        map[x][y] = 0;
    }
    cout << dice[1] << "\n";
}

int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);

    cin >> N >> M >> x >> y >> K;

    for (int i = 0; i < N; i++) {
        for (int j = 0; j < M; j++) {
            cin >> map[i][j];
        }
    }
    for (int i = 0; i < K; i++) {
        int ins;
        cin >> ins;
        if (ins == 1)
            go_east();
        else if (ins == 2)
            go_west();
        else if (ins == 3)
            go_north();
        else if (ins == 4)
            go_south();
    }
}

Python

import sys
input = sys.stdin.readline

N, M, x, y, K = map(int, input().split())

mymap = [0 for i in range(N)]
for i in range(N):
    mymap[i] = list(map(int, input().split()))

dy = [+1, -1, 0, 0]
dx = [0, 0, -1, +1]

dice = [0 for _ in range(7)]

ins = list(map(int, input().split()))
for i in range(K):
    nx = x + dx[ins[i] - 1]
    ny = y + dy[ins[i] - 1]
    if nx >= N or nx < 0 or ny >= M or ny < 0:
        continue
    if ins[i] == 1:
        tmp = dice[4]
        dice[4] = dice[6]
        dice[6] = dice[3]
        dice[3] = dice[1]
        dice[1] = tmp
    elif ins[i] == 2:
        tmp = dice[4]
        dice[4] = dice[1]
        dice[1] = dice[3]
        dice[3] = dice[6]
        dice[6] = tmp
    elif ins[i] == 3:
        tmp = dice[5]
        dice[5] = dice[6]
        dice[6] = dice[2]
        dice[2] = dice[1]
        dice[1] = tmp
    elif ins[i] == 4:
        tmp = dice[5]
        dice[5] = dice[1]
        dice[1] = dice[2]
        dice[2] = dice[6]
        dice[6] = tmp

    if mymap[nx][ny] == 0:
        mymap[nx][ny] = dice[6]
    else:
        dice[6] = mymap[nx][ny]
        mymap[nx][ny] = 0
    print(dice[1])
    x = nx
    y = ny

C++ 수정

#include <iostream>

using namespace std;

int N, M, x, y, K;

int map[20][20];

int dice[7];

int dy[4] = {+1, -1, 0, 0};
int dx[4] = {0, 0, -1, +1};

int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);

    cin >> N >> M >> x >> y >> K;

    for (int i = 0; i < N; i++) {
        for (int j = 0; j < M; j++) {
            cin >> map[i][j];
        }
    }
    for (int i = 0; i < K; i++) {
        int ins;
        cin >> ins;
        int nx = x + dx[ins - 1];
        int ny = y + dy[ins - 1];
        if (nx >= N || nx < 0 || ny >= M || ny < 0)
            continue ;
        if (ins == 1) {
            int tmp = dice[4];
            dice[4] = dice[6];
            dice[6] = dice[3];
            dice[3] = dice[1];
            dice[1] = tmp;
        }
        else if (ins == 2) {
            int tmp = dice[4];
            dice[4] = dice[1];
            dice[1] = dice[3];
            dice[3] = dice[6];
            dice[6] = tmp;
        }
        else if (ins == 3) {
            int tmp = dice[5];
            dice[5] = dice[6];
            dice[6] = dice[2];
            dice[2] = dice[1];
            dice[1] = tmp;
        }
        else if (ins == 4) {
            int tmp = dice[5];
            dice[5] = dice[1];
            dice[1] = dice[2];
            dice[2] = dice[6];
            dice[6] = tmp;
        }
        if (map[nx][ny] == 0) {
            map[nx][ny] = dice[6];
        } else {
            dice[6] = map[nx][ny];
            map[nx][ny] = 0;
        }
        cout << dice[1] << "\n";
        x = nx, y = ny;
    }
}
  • 무난한 시뮬레이션 유형이었다
  • 동서남북 이동하는 문제일 때 dx[4], dy[4] 이용하기
  • map을 통해 변수 여러 개에 할당
  • map을 list에 할당하고 싶은 경우 map()은 iterator를 반환하므로 list()로 변환이 필요
  • 처음에 변수명 map을 2차원 배열로 쓰려 했으나 오류 발생. 아마 map함수명과 겹쳐서 그런 것 같다. my_등을 붙여주자.

'알고리즘 문풀 > 백준' 카테고리의 다른 글

14500: 테트로미노  (0) 2021.08.04
13458: 시험 감독  (0) 2021.08.04
11726번: 2×n 타일링  (0) 2021.07.19
9095번: 1, 2, 3 더하기  (0) 2021.07.18
17626번: Four Squares  (0) 2021.07.17