https://www.acmicpc.net/problem/16438
import sys
from collections import deque
input = sys.stdin.readline
n = int(input())
cur = ['A'] * n
ans = set()
def dq():
q = deque([(0, n)])
while q:
for _ in range(len(q)):
start, end = q.popleft()
if end - start <= 1:
continue
mid = (start + end) // 2
for i in range(start, mid):
cur[i] = 'A'
for i in range(mid, end):
cur[i] = 'B'
q.append((start, mid))
q.append((mid, end))
ans.add(''.join(cur))
dq()
for a in ans:
print(a)
for _ in range(7 - len(ans)):
print('A' + ('B' * (n - 1)))
원숭이가 스포츠 팀을 만드는데 있어서 서로 다른 원숭이들 끼리는 서로 한번 이상 씩은 다른 팀에 속해야 하는 문제이다. 팀을 나누는데 중점을 두어야 한다.
한번씩 다른 팀에 속해야 하므로 다른 팀으로 나누는 방법을 생각해볼 수 있다. 즉, 팀을 구성하는 첫번째 방법은 반으로 쪼개서 생각하는 것이다. 이러한 접근을 하였다면 이제 그 나눈 팀 안에서만 팀원 들과 다른 팀을 맺어보면 된다는 생각으로 들어가야 한다. 즉, 분할 정복인 것이다. 그 과정이 N이 100개 일 때 7일이면 128가지가 나올 수 있기 때문에 7일 내로 모든 가짓수가 가능하다는 점도 분할 정복을 이렇게 사용한다는 이론에 날개를 달아준다.
이렇게까지 생각을 하였다면 이제 이론을 적용시켜 구현하면 된다. 각 범위에 따라 나눈 단계를 나누어야 하므로 범위를 담고 다음 범위를 전부 담아가면 된다. 즉, 나눈 범위에 층을 나누어서 진행한다. 풀이에서는 큐를 통해 한번 단계를 전부 큐에 담고 그 큐를 비울 때까지 진행하는 식으로 범위가 나눠지는 단계를 나누었다.
이렇게 Python으로 백준의 "원숭이 스포츠" 문제를 해결해보았습니다. 코드와 개념 설명을 참고하여 문제를 해결하는 데 도움이 되셨길 바랍니다! 😊