PS
[BOJ] Python 백준 주사위 쌓기(2116)
1223v
2024. 11. 22. 01:29
https://www.acmicpc.net/problem/2116
제한된 조건 내에 최대 값을 찾는 완전 탐색 문제이다.
백트래킹으로 탐색을 진행했는데 이 코드에서 유심히 봐야할 코드는 조건문이다.
조건에서 0와 5은 서로 반대편이므로 total 값에 사용될 수 없다.
마찬가지로 [1, 3 ] [2,4]는 만약 위,아래 값을 마추는 주사위로 사용되었으면, 사용이 불가능한 인덱스가 되어버린다.
즉, 이전 재귀함수에서 보내준 주사위 윗값이 같은 인덱스를 찾고 그 인덱스와 연관된 ([1, 3 ] [2,4], [0,5]) 값일 경우를 제외한 모든 값중 가장 큰값을 더한 후 다음 재귀로 넘겨주면 된다.
import sys
sys.setrecursionlimit(10**5)
input = sys.stdin.readline
N = int(input())
s = [list(map(int, input().split())) for _ in range(N)]
max_value = 0
def dfs(n,k,total):
global max_value
if n == N:
max_value = max(max_value, total)
return
x = s[n].index(k)
if x == 0:
dfs(n+1,s[n][5], total+max(s[n][1],s[n][2],s[n][3],s[n][4]))
elif x == 1:
dfs(n+1,s[n][3], total+max(s[n][0],s[n][2],s[n][4],s[n][5]))
elif x == 2:
dfs(n+1,s[n][4], total+max(s[n][0],s[n][1],s[n][3],s[n][5]))
elif x == 3:
dfs(n+1,s[n][1], total+max(s[n][0],s[n][2],s[n][4],s[n][5]))
elif x == 4:
dfs(n+1,s[n][2], total+max(s[n][0],s[n][1],s[n][3],s[n][5]))
elif x == 5:
dfs(n+1,s[n][0], total+max(s[n][1],s[n][2],s[n][3],s[n][4]))
for i in range(N):
if i == 0:
dfs(1,s[0][5], max(s[0][1],s[0][2],s[0][3],s[0][4]))
elif i == 1:
dfs(1,s[0][3], max(s[0][0],s[0][2],s[0][4],s[0][5]))
elif i == 2:
dfs(1,s[0][4], max(s[0][0],s[0][1],s[0][3],s[0][5]))
elif i == 3:
dfs(1,s[0][1], max(s[0][0],s[0][2],s[0][4],s[0][5]))
elif i == 4:
dfs(1,s[0][2], max(s[0][0],s[0][1],s[0][3],s[0][5]))
elif i == 5:
dfs(1,s[0][0], max(s[0][1],s[0][2],s[0][3],s[0][4]))
print(max_value)
회고,
주사위라는 정해진 6개의 값이라는 점을 고려 못하고, 모든 루프문을 돌며 조건 처리를 할 생각을 하고 있었다.
때로는 그냥 저렇게 모든 조건문을 적어서 처리하는 법이 더 효율적일 수 있다는 점을 염두해둬야 겠다.