[Python/백준] 14499_주사위 굴리기Coding Test/Python2023. 12. 6. 00:02
Table of Contents
728x90
반응형
https://www.acmicpc.net/problem/14499
<문제 해설>
구현 시뮬레이션 문제이다. x를 y축으로 y를 x축 주사위 출발값으로 줘서 해맸다. 조심
문제랑 똑같은 방식으로 주사위 모양 자료구조를 만든다. 문제의 그림을 토대로 설명하겠다.
ydice에는 2,1,5,6 xdice에는 4,1,2를 저장한다.
아래로 돌경우 ydice의 맨 뒷값(아래 있는값)을 빼고 ydice에 맨 앞값(북쪽 방향에 있는 값)에 넣어준다.
위로 돌경우 ydice의 맨 앞값 (아래있는값)을 빼고 yidice 맨 뒷값으로 넣어준다.
둘다 xidice의 2번째 값을 ydice의 2번째 값으로 바꿔준다.(맨 위의 값 동기화)
오른쪽으로 돌 경우 xdice의 오른쪽값을 빼서 bottom에 저장한다. ydice의 마지막값을 xdice의 첫값에 넣어준다.(밑값을 왼쪽값으로 넣어주는 것)
왼쪽으로 동 경우 xdice의 왼쪽 값을 빼서 bottom에 저장한다. ydice의 마지막값을 xdice의 마지막 값에 넣어준다.(밑값을 오른쪽 값으로 넣어주는 것)
둘다 bottom에 저장해둔 값을 ydice에 넣어준다. 여기도 똑같이 맨위 값을 동기화 해준다.(xdice[1] == ydice[1])
- 주사위를 어떤 방향으로 돌릴지 K를 commad 배열에 저장해서 하나씩 받는다.
- 방향에 따라 주사위를 위에 알려준 방식대로 돌려준다. 이때 움직인 x좌표 y좌표가 벗어났는지 체크한다. 번어날시 다시 1번으로 돌아간다.
- 움직인 곳의 board의 값이 0이 아니면 ydice[-1](ydice의 맨 뒷 값인 바닦값)을 board의 값으로 변경 후 board에 0값을 넣는다.
0값인 경우 board에 ydice[-1] 값을 넣어준다. - ydice[1] (맨 위에 값) 을 출력한다. 그후 1로 돌아간다.
<예시>
다음은 예시 3번의 결과이다. 4 4 1 1 3 3 2 2까지의 주사위를 그렸다.
위 설명대로 주사위 값이 변하는걸 확인할 수 있다.
<코드>
def xspin(d):
if d == 1:
bottom = xdice.pop()
xdice.appendleft(ydice.pop())
else:
bottom = xdice.popleft()
xdice.append(ydice.pop())
ydice.append(bottom)
ydice[1] = xdice[1]
def yspin(d):
if d == 1:
ydice.appendleft(ydice.pop())
else:
ydice.append(ydice.popleft())
xdice[1] = ydice[1]
import sys
from collections import deque
N,M,y,x,K = map(int,sys.stdin.readline().split())
ydice = deque([0,0,0,0])
xdice = deque([0,0,0])
board = []
for n in range(N):
board.append(list(map(int,sys.stdin.readline().split())))
command = list(map(int,sys.stdin.readline().split()))
move = [[0,1],[0,-1],[-1,0],[1,0]]
for c in command:
c -= 1
mx = x + move[c][1]
my = y + move[c][0]
if N > my > -1 and M > mx > -1:
x = mx
y = my
if c == 0:
xspin(1)
elif c == 1:
xspin(-1)
elif c == 2:
yspin(-1)
else:
yspin(1)
if board[y][x] != 0:
ydice[-1] = board[y][x]
board[y][x] = 0
else:
board[y][x] = ydice[-1]
print(ydice[1])
<코드 설명>
def xspin(d): //x방향 회전
if d == 1: //위로 회전
bottom = xdice.pop()
xdice.appendleft(ydice.pop())
else: //아래로 회전
bottom = xdice.popleft()
xdice.append(ydice.pop())
ydice.append(bottom)
ydice[1] = xdice[1]
def yspin(d): //y방향 회전
if d == 1: //오른쪽 회전
ydice.appendleft(ydice.pop())
else: //왼쪽 회전
ydice.append(ydice.popleft())
xdice[1] = ydice[1]
import sys
from collections import deque
N,M,y,x,K = map(int,sys.stdin.readline().split()) //값 받기
ydice = deque([0,0,0,0]) //주사위 저장 자료구조
xdice = deque([0,0,0])
board = []
for n in range(N):
board.append(list(map(int,sys.stdin.readline().split())))
command = list(map(int,sys.stdin.readline().split())) //명령 받기
move = [[0,1],[0,-1],[-1,0],[1,0]]
for c in command: //명령 하나씩 꺼내기
c -= 1 //1,2,3,4로 입력되지만 배열은 0,1,2,3 index이니까 1빼주기
mx = x + move[c][1] //이동할 좌표 계산
my = y + move[c][0]
if N > my > -1 and M > mx > -1: //이동할 곳이 좌표가 밖으로 나간건지 확인
x = mx
y = my
if c == 0: //방향을 나누기
xspin(1)
elif c == 1:
xspin(-1)
elif c == 2:
yspin(-1)
else:
yspin(1)
if board[y][x] != 0: //보드가 0값인지 값이있는지 보고 바닦값을 어떻게 할지 결정
ydice[-1] = board[y][x]
board[y][x] = 0
else:
board[y][x] = ydice[-1]
print(ydice[1]) //주사위 출력
if d == 1: //위로 회전
bottom = xdice.pop()
xdice.appendleft(ydice.pop())
else: //아래로 회전
bottom = xdice.popleft()
xdice.append(ydice.pop())
ydice.append(bottom)
ydice[1] = xdice[1]
def yspin(d): //y방향 회전
if d == 1: //오른쪽 회전
ydice.appendleft(ydice.pop())
else: //왼쪽 회전
ydice.append(ydice.popleft())
xdice[1] = ydice[1]
import sys
from collections import deque
N,M,y,x,K = map(int,sys.stdin.readline().split()) //값 받기
ydice = deque([0,0,0,0]) //주사위 저장 자료구조
xdice = deque([0,0,0])
board = []
for n in range(N):
board.append(list(map(int,sys.stdin.readline().split())))
command = list(map(int,sys.stdin.readline().split())) //명령 받기
move = [[0,1],[0,-1],[-1,0],[1,0]]
for c in command: //명령 하나씩 꺼내기
c -= 1 //1,2,3,4로 입력되지만 배열은 0,1,2,3 index이니까 1빼주기
mx = x + move[c][1] //이동할 좌표 계산
my = y + move[c][0]
if N > my > -1 and M > mx > -1: //이동할 곳이 좌표가 밖으로 나간건지 확인
x = mx
y = my
if c == 0: //방향을 나누기
xspin(1)
elif c == 1:
xspin(-1)
elif c == 2:
yspin(-1)
else:
yspin(1)
if board[y][x] != 0: //보드가 0값인지 값이있는지 보고 바닦값을 어떻게 할지 결정
ydice[-1] = board[y][x]
board[y][x] = 0
else:
board[y][x] = ydice[-1]
print(ydice[1]) //주사위 출력
728x90
반응형
'Coding Test > Python' 카테고리의 다른 글
[Python/백준] 6593 상범 빌딩 (1) | 2023.12.06 |
---|---|
[Python/백준] 4179 불! (1) | 2023.12.06 |
[Python/백준] 14891_톱니바퀴 (0) | 2023.12.05 |
[Python/백준] 3190_뱀 (1) | 2023.12.03 |
[Python/백준] 14503 로봇 청소 (1) | 2023.12.02 |
@코딩하는 자연대생 :: 자연대생도 코딩을 하고 싶어
Coding, Software, Computer Science 내가 공부한 것들 잘 이해했는지, 설명할 수 있는지 적는 공간