링크 : https://www.acmicpc.net/problem/12886
12886번: 돌 그룹
오늘 강호는 돌을 이용해 재미있는 게임을 하려고 한다. 먼저, 돌은 세 개의 그룹으로 나누어져 있으며 각각의 그룹에는 돌이 A, B, C개가 있다. 강호는 모든 그룹에 있는 돌의 개수를 같게 만들려
www.acmicpc.net
1. 코드
<python />
def BFS(s):
visited = [[False] * (total + 1) for _ in range(total+1)]
a,b = s[0],s[1]
Q = deque()
Q.append((a,b))
visited[a][b] = True
while Q:
x,y = Q.popleft()
z = total - x - y
if x == y == z:
return True
for v1,v2 in [(x,y),(y,z),(z,x)]:
if v1 > v2:
v1,v2 = v2,v1
v2 = v2-v1
v1 = 2*v1
v3 = total - v1 - v2
v1,v2 = max(v1,v2,v3),min(v1,v2,v3)
if not visited[v1][v2]:
visited[v1][v2] = True
Q.append((v1,v2))
return False
from collections import deque
s = sorted(list(map(int,input().split())))
total = sum(s)
if sum(s) % 3 != 0:
print(0)
else:
print(int(BFS(s)))
2. 포인트
- 시간초과를 방지하기 위해서는 방문처리를 두 개의 원소를 이용해야 한다.
- 두 개의 원소로 나머지 한 원소를 알아낼 방법이 있다.
3. 풀이
3.0.1. | BFS |
- Queue에는 가장 큰 원소, 가장 작은 원소가 들어간다. 이유는 세 원소가 같아지려면 가장 큰 원소는 작아져야 하고 가장 작은 원소는 커져야 하기 때문이다.
- 돌의 총 개수는 정해져 있다. 따라서 큐에서 꺼낸 두 원소를 돌의 총 개수에서 빼면 나머지 원소를 찾을 수 있다.
- 세 원소의 값이 같아지는 것이 BFS를 끝내는 조건이다.
- 방문처리를 통해 Queue에 더이상의 값이 존재하지 않는다면 세 그룹을 같게 만들 수 없는 것이다.
- 또한 기본적으로 총 돌의 개수가 3으로 나뉘지 않으면 세 개의 그룹으로 똑같이 나눠질 수 없다.
'알고리즘 > BAEKJOON (Python)' 카테고리의 다른 글
[ 백준 ][ 골드2 ] 1766번 - 문제집 ( 파이썬 ) (0) | 2023.02.27 |
---|---|
[ 백준 ][ 골드2 ] 4195번 - 친구 네트워크 ( 파이썬 ) (0) | 2023.02.25 |
[ 백준 ][ 골드3 ] 11812번 - K진 트리 ( 파이썬 ) (0) | 2023.02.21 |
[ 백준 ][ 골드3 ] 1039번 - 교환 ( 파이썬 ) (0) | 2023.02.17 |
[ 백준 ][ 골드4 ] 11657번 - 타임머신 ( 파이썬 ) (0) | 2023.02.14 |