첫 줄에는 참가한 사람의 수 k가 나온다(3 ≤ k ≤ 26). 그 다음 줄에는 가로 막대가 놓일 전체 가로 줄의 수를 나타내는 n이 나온다(3 ≤ n ≤ 1,000). 그리고 세 번째 줄에는 사다리를 타고 난 후 결정된 참가자들의 최종 순서가 길이 k인 대문자 문자열로 들어온다.
k와 n, 그리고 도착순서 문자열이 나타난 다음, 이어지는 n개의 줄에는 앞서 설명한 바와 같이 ‘*’와 ‘-’ 문자로 이루어진 길이 k-1인 문자열이 주어진다. 그 중 감추어진 가로 줄은 길이가 k-1인 ‘?’ 문자열로 표시되어 있다.
출력
입력 파일 세 번째 줄에서 지정한 도착순서가 해당 사다리에서 만들어질 수 있도록 감추어진 가로 줄을 구성해야 한다.
여러분은 감추어진 가로 줄의 상태를 재구성하여 이를 ‘*’(별) 문자와 ‘-’(빼기) 문자로 구성된 길이 k-1인 문자열로 만들어 출력하면 된다.
그런데 어떤 경우에는 그 감추어진 가로 줄을 어떻게 구성해도 원하는 순서를 얻을 수 없는 경우도 있다. 이 경우에는 ‘x’(소문자 엑스)로 구성된 길이 k-1인 문자열을 출력해야 한다.
문자열의 규칙은 꽤 간단하다. i번째 문자열이 '*'라면 그대로 진행, '-'라면 입력 문자열 [i], [i+1]의 위치를 바꾼다. 또한 사다리꼴 문자열에는 방향성이 없다. 즉 직전의 문자열은 초기 문자열을 '???????'줄이 나올 때까지 문자열 규칙에 따라 계속 변환하면 되며, 직후의 문자열은 나중 문자열을 역순으로 '???????'줄이 나올 때까지 문자열 규칙에 따라 변환한다.
두 번째 경우. 앞서 말했듯, i번째 문자열이 '*'라면 그대로 진행, '-'라면 입력 문자열 [i], [i+1]의 위치를 바꾼다. 이를 바꾸어 생각하면, 직전 문자열과 직후 문자열을 비교하여 [i]번째와 [i+1]번째 문자열 위치가 서로 바뀌어 있으면 i번째 명령어는 '-'. 그렇지 않다면 '*'로 여긴다. 이렇게 생성된 문자열 명령어를 따라 직전 문자열을 바꿨을 때, 그 결과가 직후 문자열이라면 이는 옳은 명령어이니 그대로 출력한다. 만약 일치하지 않는다면 원하는 순서를 얻을 수 없는 경우이므로 'xxxxxxxx'를 출력한다.
input_process : 문자열 명령어를 input으로 받고, 직전 문자열과 직후 문자열을 구하기 위한 명령어셋을 나눈다. '???????'이 기준이 되며, 직후 문자열을 생성하는 명령어 리스트는 뒤집어주어야 함을 명심하자.
switch : 입력받은 문자열을 commands 순서대로 문자열 명령어를 받아 변환하는 함수이다.
make_command : 직전 문자열과 직후 문자열을 입력받아, 이에 맞는 명령어를 생성하는 함수이다. 자세한 알고리즘 설명은 윗 문단에 기재되어 있다.
solve : 메인함수.
풀이 코드
import sys
input = sys.stdin.readline
K = int(input())
N = int(input())
original = [ chr(x) for x in range(65, 65+K) ]
converted = list(input().strip())
def input_process() :
flg = False
original_commands, converted_commands = list(), list()
for _ in range(N) :
command = input().strip()
if command[0] == '?' :
flg = True
elif flg :
converted_commands.append(command)
else :
original_commands.append(command)
converted_commands.reverse()
return original_commands, converted_commands
def switch(lines, commands) :
for command in commands :
for i in range(K-1) :
if command[i] == '-' :
lines[i], lines[i+1] = lines[i+1], lines[i]
def make_command(original, converted) :
result = ''
for i in range(K-1) :
if original[i] == converted[i+1] and original[i+1] == converted[i] :
result += '-'
else :
result += '*'
test = original.copy()
switch(test, [result])
return result if test == converted else 'x'*(K-1)
def solve() :
original_commands, converted_commands = input_process()
switch(original, original_commands)
switch(converted, converted_commands)
result = make_command(original, converted)
print(result)
solve()