일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 패스트캠퍼스
- 패스트캠퍼스혁펜하임
- C++ 백준
- 비교연산자
- 백준1026
- c++ 기초
- cuDNN
- 백준9095
- pytorch
- 백준
- C++ 공백 입력
- tensorflow
- 조건문
- 백준C++
- 1로만들기
- C++ 함수
- 반복문
- 혁펜하임AI
- 1463
- for문
- precision
- 혁펜하임강의
- AI강의
- AIDEEPDIVE
- CUDA
- C++
- 혁펜하임강의후기
- 9095
- 백준1463
- 혁펜하임
- Today
- Total
코딩하는 덕구 🐶
109. [삼성기출5] Python 백준 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
먼저 백준 14499 번 주사위 굴리기 파이썬 정답 코드입니다. 설명은 아래에 있습니다.
N, M, x, y, K = map(int, input().split())
graph = []
dir_x = [0, 0, 0, -1, 1]
dir_y = [0, 1, -1, 0, 0]
dice = [0, 0, 0, 0, 0, 0]
"""
*** index of dice ***
0 : 상, 1 : 하, 2: 좌, 3 : 우, 4 : 앞, 5 : 뒤
5
2 0 3
4
1
"""
for _ in range(N):
graph.append(list(map(int, input().split())))
dir_info = list(map(int, input().split()))
def roll_dice(dir): #동1, 서2, 북3, 남4
u, d, l, r, f, b = dice[0], dice[1], dice[2], dice[3], dice[4], dice[5]
if dir == 1: #동 : 오른쪽
dice[0], dice[1], dice[2], dice[3], dice[4], dice[5] = l, r, d, u, f, b
elif dir == 2: #서 : 왼쪽
dice[0], dice[1], dice[2], dice[3], dice[4], dice[5] = r, l, u, d, f, b
elif dir == 3: #북 : 위쪽
dice[0], dice[1], dice[2], dice[3], dice[4], dice[5] = f, b, l, r, d, u
elif dir == 4: #남 : 아래쪽
dice[0], dice[1], dice[2], dice[3], dice[4], dice[5] = b, f, l, r, u, d
return
def move(x, y):
for d in dir_info:
x += dir_x[d]
y += dir_y[d]
if x > N - 1 or x < 0 or y > M - 1 or y < 0:
x -= dir_x[d]
y -= dir_y[d]
continue
roll_dice(d) #주사위 움직이기
if graph[x][y] == 0:
graph[x][y] = dice[1] #주사위 바닥
else:
dice[1] = graph[x][y]
graph[x][y] = 0
print(dice[0]) #주사위 위
return
move(x, y)
문제 요약
지도와 주사위가 주어집니다.
주어진 좌표 x, y에 주사위를 놓고 지도상의 동, 서, 남, 북 중 한 방향으로 주사위르 한칸 굴립니다.
이때 지도의 해당 좌표가 0 이면 주사위의 밑면의 숫자를 복사하고
지도의 해당 좌표가 0이 아니면 주사위에 지도의 숫자를 복사하고, 해당 좌표 부분은 0 이 됩니다.
이 때 주사위가 한번 움직일 때마다 주사위의 윗면의 숫자를 출력합니다.
문제 접근
상, 하, 좌, 우, 앞, 뒤로 움직일 수 있는 주사위를 구현하는 것이 핵심입니다.
0 : 상, 1 : 하, 2: 좌, 3 : 우, 4 : 앞, 5 : 뒤
5
2 0 3
4
1
임의의 index를 통해 6개의 성분을 가진 list로 주사위를 구현한 후
동, 서, 남, 북 4 가지의 이동 방향별 주사위의 상태를 구현해주면 됩니다.
예를들어 동쪽으로 이동 할 경우
#동1, 서2, 북3, 남4
u, d, l, r, f, b = dice[0], dice[1], dice[2], dice[3], dice[4], dice[5]
if dir == 1: #동 : 오른쪽
dice[0], dice[1], dice[2], dice[3], dice[4], dice[5] = l, r, d, u, f, b
기존 주사위의 위, 아래, 좌, 우, 앞, 뒤의 성분을 저장하고,
동쪽으로 한번 회전한 주사위의 상태에 맞게 성분을 이동시켜주면 됩니다.
Python 코드 구현
세로, 가로, 주사위 세로좌표 x, 가로좌표 y, 주사위 이동 명령의 개수 k를 입력받고 저장합니다.
N, M, x, y, K = map(int, input().split())
그래프를 선언하고, 지도위의 주사위 이동을 구현하기 위한 dir_x, dir_y, 주사위 dice 까지 선언합니다.
graph = []
dir_x = [0, 0, 0, -1, 1]
dir_y = [0, 1, -1, 0, 0]
dice = [0, 0, 0, 0, 0, 0]
지도의 상태를 입력받고, 주사위 이동 명령 또한 이동받아 줍니다.
for _ in range(N):
graph.append(list(map(int, input().split())))
dir_info = list(map(int, input().split()))
이제 이 문제의 핵심 코드인 주사위를 구현해봅시다.
주사위의 상태 = list, 주사위의 상, 하, 좌, 우, 앞, 뒤 = list 의 index 가 됩니다.
*** index of dice ***
0 : 상, 1 : 하, 2: 좌, 3 : 우, 4 : 앞, 5 : 뒤
5
2 0 3
4
1
이제 주사위의 움직임을 구현해 봅시다. 동, 서, 남, 북 4가지의 방향으로 이동 가능합니다.
def roll_dice(dir): #동1, 서2, 북3, 남4
u, d, l, r, f, b = dice[0], dice[1], dice[2], dice[3], dice[4], dice[5]
if dir == 1: #동 : 오른쪽
dice[0], dice[1], dice[2], dice[3], dice[4], dice[5] = l, r, d, u, f, b
elif dir == 2: #서 : 왼쪽
dice[0], dice[1], dice[2], dice[3], dice[4], dice[5] = r, l, u, d, f, b
elif dir == 3: #북 : 위쪽
dice[0], dice[1], dice[2], dice[3], dice[4], dice[5] = f, b, l, r, d, u
elif dir == 4: #남 : 아래쪽
dice[0], dice[1], dice[2], dice[3], dice[4], dice[5] = b, f, l, r, u, d
return
방향을 입력받고 방향에 맞게 주사위를 구현 해 주면 됩니다.
각 알파벳은 up, down, left, right, front, back에서 따왔습니다.
이제 주사위를 이동시키며 규칙에 맞게 지도와 주사위를 수정하고, 매 움직임마다 주사위의 윗 부분을 출력하는 함수
move 를 만들어 봅시다. 이 함수는 주사위의 처음 위치 x, y를 입력받습니다.
방향 정보의 모든 정보를 돌면서 주사위의 위치를 업데이트 합니다.
def move(x, y):
for d in dir_info:
x += dir_x[d]
y += dir_y[d]
그리고 나서 주사위가 지도 밖으로 나간다면 원래 위치로 다시 돌려보내고 해당 명령은 무시하기 위해
contine를 통해 다음 iteration 으로 이동합니다.
if x > N - 1 or x < 0 or y > M - 1 or y < 0:
x -= dir_x[d]
y -= dir_y[d]
continue
주사위가 지도 밖에 위치 하지 않는다면 주사위를 d 방향으로 움직이고,
roll_dice(d) #주사위 움직이기
문제의 조건에 따라 지도에 아무것도 없다면 주사위의 바닥 부분을 복사해주고
if graph[x][y] == 0:
graph[x][y] = dice[1] #주사위 바닥
있다면 주사위의 밑면에 복사하고, 지도를 비워줍니다.
else:
dice[1] = graph[x][y]
graph[x][y] = 0
그리고 매 반복마다 주사위의 하늘 방향을 출력해주면 끝입니다.
print(dice[0]) #주사위 위
파이썬 백준 14499 번 주사위 굴리기 최종 코드입니다.
N, M, x, y, K = map(int, input().split())
graph = []
dir_x = [0, 0, 0, -1, 1]
dir_y = [0, 1, -1, 0, 0]
dice = [0, 0, 0, 0, 0, 0]
"""
*** index of dice ***
0 : 상, 1 : 하, 2: 좌, 3 : 우, 4 : 앞, 5 : 뒤
5
2 0 3
4
1
"""
for _ in range(N):
graph.append(list(map(int, input().split())))
dir_info = list(map(int, input().split()))
def roll_dice(dir): #동1, 서2, 북3, 남4
u, d, l, r, f, b = dice[0], dice[1], dice[2], dice[3], dice[4], dice[5]
if dir == 1: #동 : 오른쪽
dice[0], dice[1], dice[2], dice[3], dice[4], dice[5] = l, r, d, u, f, b
elif dir == 2: #서 : 왼쪽
dice[0], dice[1], dice[2], dice[3], dice[4], dice[5] = r, l, u, d, f, b
elif dir == 3: #북 : 위쪽
dice[0], dice[1], dice[2], dice[3], dice[4], dice[5] = f, b, l, r, d, u
elif dir == 4: #남 : 아래쪽
dice[0], dice[1], dice[2], dice[3], dice[4], dice[5] = b, f, l, r, u, d
return
def move(x, y):
for d in dir_info:
x += dir_x[d]
y += dir_y[d]
if x > N - 1 or x < 0 or y > M - 1 or y < 0:
x -= dir_x[d]
y -= dir_y[d]
continue
roll_dice(d) #주사위 움직이기
if graph[x][y] == 0:
graph[x][y] = dice[1] #주사위 바닥
else:
dice[1] = graph[x][y]
graph[x][y] = 0
print(dice[0]) #주사위 위
return
move(x, y)
파이썬 백준 14499 번 주사위 굴리기 자세한 설명 및 Python 코드였습니다.
감사합니다.
'알고리즘 문제 풀이' 카테고리의 다른 글
111. [삼성기출7]Python 백준 14501 번 퇴사 자세한 설명 (0) | 2023.03.24 |
---|---|
110. [삼성기출6] Python 백준 14500 번 테트로미노 자세한 설명 (0) | 2023.03.22 |
108. [삼성기출4] Python 백준 13458 번 시험 감독 자세한 설명 (0) | 2023.03.18 |
107. [삼성기출3] Python 백준 3190 번 뱀 자세한 설명 (0) | 2023.03.18 |
106. [삼성기출2] Python 백준 12100 번 2048 (Easy)자세한 설명 (0) | 2023.03.17 |