-
백준 14499) 주사위 굴리기 (골드.4)알고리즘/백준 2022. 7. 13. 22:56
https://www.acmicpc.net/problem/14499
단순 구현의 문제라고 생각하고 문제에 주어진 주사위 모양을 참고하여 구현하였다.
조건을 확인하면 다음과 같다.
1) 이동 방향이 동서북남
2) 지도상 좌표의 숫자가 0일 경우 이동한 주사위의 밑면의 숫자를 복사할 것
3) 지도상 좌표의 숫자가 0이 아닐 경우 주사위 밑면에 지도상의 숫자를 복사하고 지도상 좌표의 수는 0으로 만들 것
구현하고 나서 계속해서 예제 4번에서 틀린 답이 나왔는데 지도상 좌표의 숫자가 0일 경우 이동한 주사위의 밑면 숫자를 복사하고 주사위 밑면의 숫자는 건들지 않아야 한다는 것을 자세히 보지 못해서 틀렸다. ( 문제를 잘 읽고 주사위 숫자를 0으로 바꾸지 않도록 하자!)
처음 구현한 코드는 다음과 같다.
from collections import deque n, m, y, x, k = map(int, input().split()) board = [[] for _ in range(n)] for i in range(n): num = list(map(int, input().split())) board[i].extend(num) directions = list(map(int, input().split())) # 동서북남 방향 d = [(0, 1), (0, -1), (-1, 0), (1, 0)] global dice_row, dice_column dice_row = deque([0, 0, 0]) dice_column = deque([0, 0, 0, 0]) def roll_dice(direction, num): global dice_row, dice_column if direction == 1 : upper = dice_column.pop() dice_column.append(dice_row.popleft()) dice_row.append(upper) dice_column[1] = dice_row[1] elif direction == 2: upper = dice_column.pop() dice_column.append(dice_row.pop()) dice_row.appendleft(upper) dice_column[1] = dice_row[1] elif direction == 3: dice_column.appendleft(dice_column.pop()) dice_row[1] = dice_column[1] elif direction == 4 : dice_column.append(dice_column.popleft()) dice_row[1] = dice_column[1] bottom = dice_column[1] if num != 0 : dice_column[1] = num dice_row[1] = num return bottom for direction in directions: ny = y + d[direction-1][0] nx = x + d[direction-1][1] if nx<0 or m<=nx or ny<0 or n<=ny : continue y, x = ny, nx if board[y][x] == 0 : board[y][x] = roll_dice(direction, board[y][x]) else : roll_dice(direction, board[y][x]) board[y][x] = 0 print(dice_column[3])
주사위 모양을 문제의 내용을 참고하여 가로 세로 따로따로 구현하고자 하다보니 deque가 두개가 나오게 되었다.
정답을 통과하고 다른 사람의 답변을 보니 다음과 같이 간단한 식으로도 구현이 가능하였다. 😭
n, m, y, x, k = map(int, input().split()) board = [[] for _ in range(n)] for i in range(n): num = list(map(int, input().split())) board[i].extend(num) directions = list(map(int, input().split())) # 동서북남 방향 d = [(0, 1), (0, -1), (-1, 0), (1, 0)] global dice # 왼, 오, 앞, 뒤, 상, 하 dice = [0, 0, 0, 0, 0, 0] def roll_dice(direction, num): global dice a, b, c, d, e, f = dice[0], dice[1], dice[2], dice[3], dice[4], dice[5] # 동 if direction == 1 : dice[0], dice[1], dice[2], dice[3], dice[4], dice[5] = e, f, c, d, b, a elif direction == 2: dice[0], dice[1], dice[2], dice[3], dice[4], dice[5] = f, e, c, d, a, b elif direction == 3: dice[0], dice[1], dice[2], dice[3], dice[4], dice[5] = a, b, e, f, d, c elif direction == 4 : dice[0], dice[1], dice[2], dice[3], dice[4], dice[5] = a, b, f, e, c, d bottom = dice[4] if num != 0 : dice[4] = num return bottom for direction in directions: ny = y + d[direction-1][0] nx = x + d[direction-1][1] if nx<0 or m<=nx or ny<0 or n<=ny : continue y, x = ny, nx if board[y][x] == 0 : board[y][x] = roll_dice(direction, board[y][x]) else : roll_dice(direction, board[y][x]) board[y][x] = 0 print(dice[5])
주사위 배열을 만들고 면마다 인덱스를 이용해서 면을 이동시키도록 한다.
다행히 메모리 상의 큰 차이는 없었다!
'알고리즘 > 백준' 카테고리의 다른 글
백준 14889) 스타트와 링크 (실버.2) (0) 2022.07.14 백준 3190) 뱀 (골드.4) (0) 2022.07.13 백준 1956번)브루트포스- 분해합 (0) 2021.08.16 백준 1956번) 최단경로 - 운동 (0) 2021.01.29 백준 1904번) 동적계획법 1 - 01.타일 (0) 2021.01.29