문제풀이/일일연습문제

*재풀이 필요[simulation]99클럽 코테 스터디 33일차 TIL + 백준/Bronze/13419. 탕수육

Mo_bi!e 2024. 11. 30. 10:55

탕수육 게임

문제

환규와 태욱이는 둘이서 즐길 수 있는 간단한 게임인 탕수육 게임을 하기로 했다. 게임의 규칙은 다음과 같다:

  1. 누가 먼저 시작할지 순서를 정한다.
  2. 먼저 시작하는 사람이 단어의 가장 첫 글자를 말한다.
  3. 이후 두 사람이 번갈아 가며 자신의 차례에 이전 사람이 말한 글자의 다음 글자를 말한다.
  4. 만약 이전 사람이 단어의 가장 마지막 글자를 말했다면 자신의 차례에 단어의 가장 첫 글자를 말한다.
  5. 만약 자신의 차례에 잘못된 글자를 말하면 게임에서 지게 된다.

위 규칙을 이용해 “탕수육”이라는 단어로 게임을 진행하면, 각 사람이 번갈아 가며 말한 부분을 따라가면 아래와 같다:

탕 수 육 탕 수 육 탕 수 육 탕 수 육 …

여기서 첫 번째 사람이 말하는 부분만 보면 “탕육수탕육수…”이고, 두 번째 사람은 “수탕육수탕…”이다. 첫 번째 사람은 “탕육수”만 기억하면 절대로 틀리지 않는다.

환규와 태욱이는 이번에 한글 대신 알파벳으로 게임을 해보기로 했다. 주어진 알파벳 문자열에 대해, 두 사람이 기억해야 하는 문자열 중 가장 짧은 것을 구하시오.

입력

  • 첫 번째 줄에 테스트 케이스의 개수 T가 주어진다.
  • 각 테스트 케이스의 첫째 줄에 게임에 사용할 문자열이 주어진다.
  • 문자열의 길이는 1 이상 26 이하이며, 알파벳 대문자로만 이루어져 있고 중복된 문자는 없다.

출력

  • 각 테스트 케이스마다 첫 번째 줄에 먼저 시작한 사람이 기억해야 할 가장 짧은 문자열을 출력한다.
  • 두 번째 줄에 나중에 시작한 사람이 기억해야 할 가장 짧은 문자열을 출력한다.

예제 입력 1

4
ABC
ABCFXZ
K
DY

예제 출력 1

ACB
BAC
ACX
BFZ
K
K
D
Y

 

 

<내 코드>

import sys

def minimal_period(s):
    n = len(s)
    for p in range(1, n + 1):
        if n % p == 0 and s == s[:p] * (n // p):
            return s[:p]
    return s

def get_player_sequence(s, start):
    n = len(s)
    letters = []
    for i in range(n):
        index = (i * 2 + start) % n
        letters.append(s[index])
    sequence = ''.join(letters)
    return minimal_period(sequence)

T = int(sys.stdin.readline().strip())

for _ in range(T):
    s = sys.stdin.readline().strip()
    hwan = get_player_sequence(s, 0)  # 첫 번째 사람은 0부터 시작
    tae = get_player_sequence(s, 1)   # 두 번째 사람은 1부터 시작

    print(hwan)
    print(tae)


# import sys
#
# def find_min_rotation(s):
#     n = len(s)
#     double_s = s + s
#     return min(double_s[i : i + n] for i in range(n))
#
# # 무조건 이기기 위한 값?
# T = int(sys.stdin.readline().strip())
#
# # 어떻게 하면 기억해야할 문자열 중 가장 짧은 것을 출력할 수 있을까?
# for _ in range(T):
#     s = sys.stdin.readline().strip()
#     hwan = find_min_rotation(s) # 먼저
#     tae = find_min_rotation(s[::-1]) # 다음
#
#     print(hwan)
#     print(tae)
#
#
#
#     # # 우선 해당 문자열을 최대한 나열하고, 반복되는 지점을 찾는다.
#     # # 반복되는 직전까지를 가장 짧은 문자열로 뽑아낸다.
#     # i = 0
#     # while True :
#     #     turn_index = i % len(s)
#     #     if len(hwan) <= len(tae):
#     #         hwan.append(s[turn_index])
#     #     else :
#     #         tae.append(s[turn_index])
#     #
#     #     if i == 20:
#     #         break
#     #
#     #     i += 1