BOJ 2642 전개도

LONGNEW·2022년 1월 6일
0

BOJ

목록 보기
286/333

https://www.acmicpc.net/problem/2642
시간 1초, 메모리 128MB

input :

  • 여섯 줄, 0 ~ 6 까지의 정수

output :

  • 정육면체에서 1번으로 표시된 면의 맞은 편 면의 번호를 출력
  • 정육면체로 접을 수 없으면 0을 출력

정육면체 전개도는 11가지이다. 근데 이 11가지를 뒤집고, 돌린 경우도 따져야 한다. 이걸 딕셔너리로 만들어서 하는 방법은 도저히 모르겠고 에러가 날 거 같아서 포기했다.

다음에 풀 때 생각할 것

  1. 맞은 편 면은?
  2. 전개도가 안 되는 경우는?

-> 맞은편을 찾기 위해서는 동일한 방향으로 2번 이동했을 때의 면을 찾아야 한다.
-> 맞은 편 면이 추가적으로 존재하는지. 찾아야 할 거 같은데 (보류)
-> 1, 2, 3, 4, 5, 6 말고 추가적인 숫자 혹은 더 적은 숫자가 존재하는 지 확인한다.

찐 구현으로 미친놈처럼 다 만들어서 하고 싶었는데 방향 바뀌는 게 너무 큰 거 같다.
사실 11개 만들어서 4방으로 뒤집고, 4방으로 회전 시켜서 만들면 될 거 같은데 나중에 "1"의 맞은 편 찾는게 매우 귀찮을 거 같았다.

import sys


def dfs(x, y, direction, now_direct, cnt, num):
    if cnt == 2 and direction == now_direct:
        oppo[num].append(graph[x][y])
        return

    visit[x][y] = 1

    for i in range(4):
        nx = x + dx[i]
        ny = y + dy[i]

        if nx < 0 or nx >= 6 or ny < 0 or ny >= 6:
            continue
        if graph[nx][ny] == 0:
            continue
        if visit[nx][ny] == 1:
            continue

        if direction == i:
            cnt += 1
        visit[nx][ny] = 1
        dfs(nx, ny, direction, i, cnt, num)

        if direction == i:
            cnt -= 1

    return 0


graph, oppo = [], [[] for _ in range(7)]

# 오른쪽, 왼쪽, 아래, 위
dx = [0, 0, 1, -1]
dy = [1, -1, 0, 0]
for _ in range(6):
    temp = list(map(int, sys.stdin.readline().split()))
    graph.append(temp)

total = 0
for item in graph:
    total += sum(item)

if total != 21:
    print(0)
    exit(0)

for x in range(6):
    for y in range(6):

        if graph[x][y] != 0:
            for i in range(4):
                nx = x + dx[i]
                ny = y + dy[i]

                if nx < 0 or nx >= 6 or ny < 0 or ny >= 6:
                    continue
                if graph[nx][ny] == 0:
                    continue

                visit = [[0] * 6 for _ in range(6)]
                visit[x][y] = 1
                dfs(nx, ny, i, i, 1, graph[x][y])

flag = 0
for item in oppo[1:]:
    if len(item) >= 2 or len(item) == 0:
        flag = 1

if not flag:
    print(oppo[1][0])
else:
    print(0)

0개의 댓글