728x90
삼각형 게임
문제
삼각형 게임은 시작할때 여섯개의삼각형을 부여받는데, 각 변에는 숫자가 쓰여있다(그림 참고). 이 삼각형들을 돌리고 움직여서 육각형을 만들어야 하는데, 반드시같은 숫자가 쓰여있는 변끼리만 닿아 있어야 한다. 삼각형을 뒤집을 순 없다. 완성된 육각형은 다음과 같다.
점수를 계산하는 기준은 육각형의 각 변에 쓰인 숫자들의 합이다.
당신은 어떤 삼각형 세트를 부여받았을때 그 세트에서 나올 수 있는 최고점수를 계산하는 것이다.
입력
입력은 여러개의 세트로 이루어져 있다.
각 세트는 1이상 100이하의 정수 세개로 이루어진 수열 6개로 이루어져 있다.
수열 안의 수는 삼각형 변에 쓰여 있는 수를 시계방향으로 왼쪽부터 입력한 것이다.
세트는 별표(*) 하나를 포함하고 있는 줄로 구분된다.
마지막 세트는 달러($)기호로 종결한다.
출력
각 세트 순서에 맞추어, 육각형 형성이 가능하다면 육각형의 최고점수를, 불가능하다면 none을 출력한다.
처음에는 어떻게 풀지 막막했다.
이어지는걸 어떻게 판단해야할지 구하지 못했다.
그러다가 생각한 방법이 총 나오는 방법이 크게 3가지라고 생각을 하여 처음 삼각형의 1, 2, 3번 숫자를 선택하였을 때 이어지는 숫자가 있는가 확인하는 방법이다.
그리고 다른 삼각형에 같은 숫자가 있다면 다음 숫자는 더하는 숫자가 될것이고 그다음 숫자는 다음 이어지는 숫자가 될 것이다. 이러한 방법을 생각하여 문제를 풀었다.
import sys
input = sys.stdin.readline
def dfs(n,now,sum_v):
global total
# 6개의 삼각형을 다 탐색했으면
if n == 6:
# 마지막 삼각형과 첫번째 삼각형이
# 이어지는지 확인
if tris[0][cnt] == now:
total = sum_v
else:
total = 0
return
# 6개의 삼각형 탐색
for i in range(6):
if visit[i] == 1:
continue
# 3개의 숫자 확인
for j in range(3):
# 이어지는가 확인
if now == tris[i][j]:
visit[i] = 1
# 다음의 숫자는 더하고
# 다다음 숫자와 이어지는 삼각형을 찾기위해 전달
dfs(n+1,tris[i][(j+2)%3],sum_v+tris[i][(j+1)%3])
visit[i] = 0
while 1:
tris = []
for _ in range(6):
tris.append(list(map(int,input().split())))
max_v = 0
visit = [0] * 6
# 3개의 숫자중 하나씩 선택
for cnt in range(3):
total = 0
dfs(0,tris[0][cnt],0)
if max_v < total:
max_v = total
# max_v 가 0 이면 어떤 방법으로도
# 못만드다는 것이기 때문에 none
if max_v:
print(max_v)
else:
print('none')
# 다음 입력
next = input().strip()
if next == "*":
pass
elif next == "$":
break
'@@@ 알고리즘 > 백준 스터디' 카테고리의 다른 글
백준16441 (아기돼지와 늑대) - 해결 (0) | 2022.02.24 |
---|---|
백준20165 (인내의 도미노 장인 호석) - 해결 (0) | 2022.02.24 |
백준 1719(택배) - 참고 해결 (0) | 2022.02.19 |
백준 14550(마리오 파티) - 해결 (0) | 2022.02.17 |
백준 3649(로봇 프로젝트) - 해결(python) (0) | 2022.02.06 |