탕수육 게임
문제
환규와 태욱이는 둘이서 즐길 수 있는 간단한 게임인 탕수육 게임을 하기로 했다. 게임의 규칙은 다음과 같다:
- 누가 먼저 시작할지 순서를 정한다.
- 먼저 시작하는 사람이 단어의 가장 첫 글자를 말한다.
- 이후 두 사람이 번갈아 가며 자신의 차례에 이전 사람이 말한 글자의 다음 글자를 말한다.
- 만약 이전 사람이 단어의 가장 마지막 글자를 말했다면 자신의 차례에 단어의 가장 첫 글자를 말한다.
- 만약 자신의 차례에 잘못된 글자를 말하면 게임에서 지게 된다.
위 규칙을 이용해 “탕수육”이라는 단어로 게임을 진행하면, 각 사람이 번갈아 가며 말한 부분을 따라가면 아래와 같다:
탕 수 육 탕 수 육 탕 수 육 탕 수 육 …
여기서 첫 번째 사람이 말하는 부분만 보면 “탕육수탕육수…”이고, 두 번째 사람은 “수탕육수탕…”이다. 첫 번째 사람은 “탕육수”만 기억하면 절대로 틀리지 않는다.
환규와 태욱이는 이번에 한글 대신 알파벳으로 게임을 해보기로 했다. 주어진 알파벳 문자열에 대해, 두 사람이 기억해야 하는 문자열 중 가장 짧은 것을 구하시오.
입력
- 첫 번째 줄에 테스트 케이스의 개수
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
'문제풀이 > 일일연습문제' 카테고리의 다른 글
*재풀이 필요[simulation]99클럽 코테 스터디 34일차 TIL + 백준/133502/햄버거 만들기 (0) | 2024.12.01 |
---|---|
[Sort]99클럽 코테 스터디 31일차 TIL + 백준/Silver/1755. 숫자놀이 (0) | 2024.11.28 |
[Sort]99클럽 코테 스터디 30일차 TIL + 백준/Bronze/1524. 세준세비 (1) | 2024.11.27 |
[Sort]99클럽 코테 스터디 29일차 TIL + 2327-largest-number-after-digit-swaps-by-parity (0) | 2024.11.26 |
[Sort]99클럽 코테 스터디 28일차 TIL + python_Algorithm/0506-relative-ranks (0) | 2024.11.25 |