-
[BOJ 23288, Python 3] 주사위 굴리기 2알고리즘/BOJ 2021. 10. 25. 19:48반응형
https://www.acmicpc.net/problem/23288
이번에 나온 삼성 SW 역량테스트 문제입니다.
풀이
먼저 점수를 저장할 배열을 만들어주고, 플러드 필을 이용하여 본문에 나온대로 각 칸마다 B와 C를 곱한 값을 점수 배열에 저장하면 됩니다. 이 부분은 쉬우니까 넘어가겠습니다.
문제는 주사위를 굴리는 것입니다. 이것은 전개도 그림을 사용하여 설명하겠습니다.
처음 전개도가 위와 같이 있을 때, 설명하기 쉬운 남쪽과 북쪽으로 이동하는 것부터 설명하겠습니다.
먼저 남쪽으로 움직이는 경우에는 윗 면이 1이었던게 2가 되기 때문에 전개도의 가운데 줄이 컨베이어 벨트처럼 위에서 아래로 움직이게 됩니다.
북쪽으로 움직이는 경우에는 윗 면이 1이었던게 5가 되기 때문에 남쪽과는 반대로 전개도의 가운데 줄이 아래에서 위로 움직이게 됩니다.
동쪽으로 움직일 때는 숫자 4가 윗 면이 되므로 두번째 줄의 숫자가 오른쪽으로 이동하고, 숫자 3과 숫자 6의 자리를 바꾸게 됩니다. 이 과정은 결과적으로 아래 사진과 같습니다.
서쪽으로 움직일 때는 숫자 3이 윗 면이 되므로 동쪽으로 움직일 때와 반대로 두번째 줄의 숫자가 왼쪽으로 이동하고, 숫자 4와 숫자 6의 자리를 바꾸게 됩니다. 이 과정도 결과적으로 아래 사진과 같습니다.
이처럼 주사위를 굴리는 방향에 따라 해당 숫자의 동서남북 숫자가 달라지게 되니 전개도 배열을 하나 만들어서 움직일 때마다 전개도를 수정해주시면 됩니다.
코드
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152from collections import dequeinput = __import__('sys').stdin.readlinedx, dy =[0, 1, 0, -1], [1, 0, -1, 0]n, m, z = map(int, input().split())arr = [[*map(int, input().split())] for _ in range(n)]# 플러드 필score = [[0] * m for _ in range(n)]visit = [[0] * m for _ in range(n)]for i in range(n):for j in range(m):if not visit[i][j]:q = deque([[i, j]])visit[i][j] = 1; val = 1coordinate = [(i, j)]while q:x, y = q.popleft()for k in range(4):nx, ny = x + dx[k], y + dy[k]if 0 <= nx < n and 0 <= ny < m and not visit[nx][ny] and arr[x][y] == arr[nx][ny]:visit[nx][ny] = 1; val += 1coordinate.append((nx, ny))q.append([nx, ny])for x, y in coordinate:score[x][y] = arr[x][y] * val# 주사위 굴리기dice = [2, 1, 5, 6, 4, 3] # 전개도down = [0, 6, 5, 4, 3, 2, 1]ans = 0arrow = 0 # (0 으론쪽 이동, 1 아래 이동, 2 왼쪽 이동, 3 위 이동) : 전개도는 반대로 움직임x, y = 0, 0nx, ny = 0, 0for _ in range(z):x, y = nx, nynx, ny = x + dx[arrow], y + dy[arrow]if not(0 <= nx < n and 0 <= ny < m): # 이동할 수 없으면 반대 방향으로 이동arrow = (arrow + 2) % 4nx, ny = x + dx[arrow], y + dy[arrow]ans += score[nx][ny]if arrow == 0: dice[4], dice[1], dice[5], dice[3] = dice[3],dice[4], dice[1], dice[5]if arrow == 1: dice[0], dice[1], dice[2], dice[3] = dice[3], dice[0], dice[1], dice[2]if arrow == 2: dice[4], dice[1], dice[5], dice[3] = dice[1], dice[5], dice[3], dice[4]if arrow == 3: dice[0], dice[1], dice[2], dice[3] = dice[1], dice[2], dice[3], dice[0]if dice[3] > arr[nx][ny] : arrow = (arrow + 1) % 4if dice[3] < arr[nx][ny] : arrow = (arrow + 3) % 4print(ans)cs 반응형'알고리즘 > BOJ' 카테고리의 다른 글
[BOJ 9167, Python 3] 도발 봇 (0) 2022.05.07 [BOJ 2424, Python 3] 부산의 해적 (0) 2021.10.26 [BOJ 23240, Python 3] Colorful Tower of Hanoi (0) 2021.10.13 [BOJ 23033, Python 3] 집에 빨리 가고 싶어! (0) 2021.10.05 [BOJ 23034, Python 3] 조별과제 멈춰! (0) 2021.10.05