ProblemSolving/구현, 시뮬레이션, 완전탐색

백준 14499 주사위 굴리기 (Python)

OSNIM 2022. 4. 6. 00:44
반응형

문제

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

 

나의 접근법

먼저 이해가 안되어서 문제를 그림으로 펼쳐서 주사위를 하나 하나 이동시키고 윗면(x표시)을 확인했습니다.

처음에 전개도가 나와서 시작부터 전개도 모양인줄 알고 따라했는데 도처히 예제처럼 답이 안나와서 헤맸는데 제가 문제를 제대로 읽지 않았습니다.

처음 시작은 주사위의 모든 면이 0 입니다! 

그 후 각 이동 명령에서 주사위의 이동을 다음과 같이 표현하며 규칙이나 성질을 찾아봤습니다.

위와 같이 동쪽으로 이동할 경우 윗면이 동쪽으로 이동하므로 배열에서 4번으로 이동하게 됩니다.

동, 서, 남, 북 모두 규칙을 찾아 구현을 하니 쉽게 정답을 맞을 수 있었습니다.

제출 코드

def check(x, y):
    if 0 <= x < N and 0 <= y < M:
        return True
    return False
N, M, x, y, K = map(int, input().split())
graph = []
for i in range(N):
    graph.append(list(map(int, input().split())))
commands = list((map(int, input().split())))
dice = [0, 0, 0, 0, 0, 0, 0]

for cmd in commands:
    if cmd == 1: # 동
        nx, ny = x, y + 1
        if check(nx, ny):
            dice1, dice2, dice3, dice4, dice5, dice6 = dice[1], dice[2],  dice[3], dice[4], dice[5], dice[6]
            dice[1], dice[2],  dice[3], dice[4], dice[5], dice[6]  = dice4, dice2, dice1, dice6, dice5, dice3
            if graph[nx][ny] == 0:
                graph[nx][ny] = dice[6]
            else:
                dice[6] = graph[nx][ny]
                graph[nx][ny] = 0
            print(dice[1])
        else:
            continue

    elif cmd == 2: # 서
        nx, ny = x, y - 1
        if check(nx, ny):
            dice1, dice2, dice3, dice4, dice5, dice6 = dice[1], dice[2], dice[3], dice[4], dice[5], dice[6]
            dice[1], dice[2], dice[3], dice[4], dice[5], dice[6] = dice3, dice2, dice6, dice1, dice5, dice4
            if graph[nx][ny] == 0:
                graph[nx][ny] = dice[6]
            else:
                dice[6] = graph[nx][ny]
                graph[nx][ny] = 0
            print(dice[1])
        else:
            continue

    elif cmd == 3: # 북
        nx, ny = x - 1, y
        if check(nx, ny):
            dice1, dice2, dice3, dice4, dice5, dice6 = dice[1], dice[2], dice[3], dice[4], dice[5], dice[6]
            dice[1], dice[2], dice[3], dice[4], dice[5], dice[6] = dice5, dice1, dice3, dice4, dice6, dice2
            if graph[nx][ny] == 0:
                graph[nx][ny] = dice[6]
            else:
                dice[6] = graph[nx][ny]
                graph[nx][ny] = 0
            print(dice[1])
        else:
            continue

    else: # 남
        nx, ny = x + 1, y
        if check(nx, ny):
            dice1, dice2, dice3, dice4, dice5, dice6 = dice[1], dice[2], dice[3], dice[4], dice[5], dice[6]
            dice[1], dice[2], dice[3], dice[4], dice[5], dice[6] = dice2, dice6, dice3, dice4, dice1, dice5
            if graph[nx][ny] == 0:
                graph[nx][ny] = dice[6]
            else:
                dice[6] = graph[nx][ny]
                graph[nx][ny] = 0
            print(dice[1])
        else:
            continue

    x, y = nx, ny

 

후기 

처음으로 검색이나 도움 없이 스스로 정답을 맞추었습니다. 사실 크게 어렵진 않아서 맞춘 것이 그렇게 기분이 좋지는 않았으나 계속 성장하는 느낌이 들었네요

다음에도 이렇게 큰 어려움 없이 해결했으면 좋겠습니다.

반응형