Heeto
article thumbnail
링크 : 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. 포인트


 

  1. 시간초과를 방지하기 위해서는 방문처리를 두 개의 원소를 이용해야 한다.
  2. 두 개의 원소로 나머지 한 원소를 알아낼 방법이 있다. 

 

3. 풀이


3.0.1. | BFS |

  • Queue에는 가장 큰 원소, 가장 작은 원소가 들어간다. 이유는 세 원소가 같아지려면 가장 큰 원소는 작아져야 하고 가장 작은 원소는 커져야 하기 때문이다.
  • 돌의 총 개수는 정해져 있다. 따라서 큐에서 꺼낸 두 원소를 돌의 총 개수에서 빼면 나머지 원소를 찾을 수 있다.
  • 세 원소의 값이 같아지는 것이 BFS를 끝내는 조건이다.
  • 방문처리를 통해 Queue에 더이상의 값이 존재하지 않는다면 세 그룹을 같게 만들 수 없는 것이다.
  • 또한 기본적으로 총 돌의 개수가 3으로 나뉘지 않으면 세 개의 그룹으로 똑같이 나눠질 수 없다.

 

profile

Heeto

@Heeto

🐧 블로그를 옮기는 과정에서 문법과 구성에 조금씩 오류가 있을 수 있습니다. 틀린 부분이 있다면 언제든지 알려주세요. 🐧