[ BOJ / Python ] 12886번 돌 그룹

황승환·2022년 5월 23일
0

Python

목록 보기
308/498


이번 문제는 BFS를 이용하여 해결하였다. 세 그룹의 총 합을 미리 구한 후에, 큐에는 두 그룹만 넣고, 이 두 그룹과 총 합을 통해 나머지 하나의 그룹까지 이용할 수 있도록 한다. 세 그룹들을 모든 방법으로 비교하며 주어진 연산을 적용시킨다. 그리고 세 그룹들의 값을 min, max를 통해 순서가 다른 경우를 모두 없애주고, 방문처리를 하며 탐색해나간다. 만약 세 그룹의 크기가 같아지면 1을 반환하고, while문이 끝나도 세 그룹이 다르다면 0을 반환하도록 하였다. 그리고 총 합이 3으로 나눠떨어지지 않으면, 답이 0이 되도록하고, 나눠 떨어지면 bfs함수를 실행하여 탐색하도록 하였다.

Code

from collections import deque
a, b, c=map(int, input().split())
s=a+b+c
visited=[[False for _ in range(s)] for _ in range(s)]
def bfs():
    q=deque()
    q.append((a, b))
    visited[a][b]=True
    while q:
        i, j=q.popleft()
        k=s-j-i
        if i==j==k:
            return 1
        for x, y in (i, j), (j, k), (k, i):
            if x<y:
                x+=x
                y-=x
            elif x>y:
                x-=y
                y+=y
            else:
                continue
            z=s-x-y
            nx=min(x, y, z)
            ny=max(x, y, z)
            if 0<=nx and 0<=ny and 0<=s-nx-ny:
                if not visited[nx][ny]:
                    q.append((nx, ny))
                    visited[nx][ny]=True
    return 0
answer=0
if not s%3:
    answer=bfs()
print(answer)

profile
꾸준함을 꿈꾸는 SW 전공 학부생의 개발 일기

0개의 댓글