일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 코딩테스트
- 다이나믹 프로그래밍
- 구현
- DP
- 해슁
- DFS
- Color
- CleanCode
- algorithm
- 알고리즘
- Spring
- SWEA
- 자바
- 검색트리
- Web
- 클린코드
- javascript
- inflearn
- 정렬
- Kotlin
- java
- html
- codecademy
- android
- BFS
- front-end
- CSS
- 순환
- SQL
- 프로그래머스
- Today
- Total
깡뇽
[백준] 14499번 주사위 굴리기 파이썬 본문
NxM 크기 지도
오른쪽 : 동쪽, 위쪽 : 북쪽
지도의 좌표 (r, c) : r은 북쪽으로부터 떨어진 칸의 개수, c는 서쪽으로부터 떨어진 칸의 개수
주사위는 지도 (x, y)위치에 놓여있으며, 위에 윗 면이 1이고, 동쪽을 바라보는 방향이 3인 상태.
가장 처음 주사위 모든 면에 0이 적혀져 있음.
주사위를 굴렸을 때, 이동한 칸에 쓰여 있는 수가 0이면, 주사위의 바닥면에 쓰여 있는 수가 칸에 복사된다. 0이 아닌 경우에는 칸에 쓰여 있는 수가 주사위의 바닥면으로 복사되며, 칸에 쓰여 있는 수는 0이 된다.
- 입력
1줄 : 세로 크기 N, 가로 크기 M (1 ≤ N, M ≤ 20) , 주사위를 놓을 곳의 좌표 x, y (0 ≤ x ≤ N-1, 0 ≤ y ≤ M-1) , 명령의 개수 K (1 ≤ K ≤ 1,000)
2~N줄 : 지도에 쓰여 있는 수(북->남/서->동/주사위를 놓은 칸에 쓰인 수 == 0)
마지막줄 : 이동하는 명령(동쪽: 1, 서쪽: 2, 북쪽: 3, 남쪽: 4)
- 출력
이동할 때마다 주사위의 윗 면에 쓰여 있는 수
(바깥으로 이동하는 경우, 해당 명령을 무시하고 출력X)
14499번 주사위 굴리기
n, m, x, y, k = map(int, input().split())
numbers = [list(map(int, input().split())) for _ in range(n)]
order = list(map(int, input().split()))
dice = [0 for _ in range(6)]
dx = [0, 0, -1, 1]
dy = [1, -1, 0, 0]
def turn(direction):
zero, one, two, three, four, five = dice[0], dice[1], dice[2], dice[3], dice[4], dice[5]
if direction == 1: #동
dice[0], dice[2], dice[3] = three, zero, two
if direction == 2: #서
dice[0], dice[2], dice[3] = two, three, zero
if direction == 3: #북
dice[0], dice[1], dice[4], dice[5] = four, zero, five, one
if direction == 4: #남
dice[0], dice[1], dice[4], dice[5] = two, five, zero, four
for dir in order:
nx = x + dx[dir-1]
ny = y + dy[dir-1]
if 0 > nx >= n or 0 > ny >= m:
continue
x, y = nx, ny
turn(dir)
if numbers[x][y] == 0:
numbers[x][y] = dice[5]
else:
dice[5] = numbers[x][y]
numbers[x][y] = 0
print(dice[0])
turn 함수를 통해 동, 서, 남, 북에 따라 주사위의 값을 변경한다. 주사위에 따른 이동은 order리스트에 있는 방향 정보들을 하나씩 꺼내고 nx와 ny 변화로 구현할 수 있다. 다만 1~4의 값이므로 -1을 해주어 0~3으로 활용한다. (원래라면 for i in range(4): nx = nx + dx[i] 같은 식으로 사용했을텐데) 전체 크기 NxM을 벗어나면 continue를 시키고, 벗어나지 않는 경우에만 회전을 시켜서 해당 값이 0일 경우에는 주사위의 바닥 값을 numbers에 넣는다. 그렇지 않을 떄에는 주사위 바닥에 numbers 값을 넣고 numbers는 0으로 만든다.
=> 그런데 코드에서 무언가 잘못되어서 에러가 난다.. 흠
출처 : https://www.acmicpc.net/problem/14499
'Algorithm > BAEKJOON' 카테고리의 다른 글
[백준] 17140번 이차원 배열과 연산 파이썬 (0) | 2022.10.11 |
---|---|
[백준] 15683번 감시 파이썬 (0) | 2022.10.11 |
[백준] 17406번 배열 돌리기4 파이썬 (0) | 2022.10.07 |
[백준] 16935번 배열 돌리기3 파이썬 (0) | 2022.10.07 |
[백준] 16927번 배열 돌리기2 파이썬 (0) | 2022.10.07 |