약 30분간 시도했는데, 하나의 함수 구현방법이 떠오르지 않아서(정확히는 좀 까다로워 보여서) 시간을 넘겼다.
def proceed():
current_position = [chr(i+65) for i in range(K)]
next_position = [None] * K
for i in range(len(before_ladder)):
next_position = current_position
string = before_ladder[i]
for j in range(K-2):
if j == 0:
if string[j] == "-":
next_position[j+1] = current_position[j]
elif j == K-2:
if string[j-1] == "-":
next_position[j-1] = current_position[j]
else:
if string[j] == "-":
next_position[j+1] = current_position[j]
elif string[j-1] == "-":
next_position[j-1] = current_position[j]
else:
next_position[j] = current_position[j]
current_position = next_position
return current_position
def reverse():
current_position = desired_answer
prev_position = [None] * K
for i in range(len(after_ladder)-1, -1, -1):
prev_position = current_position
string = after_ladder[i]
for j in range(K-2):
if j == 0:
if string[j] == "-":
prev_position[j+1] = current_position[j]
elif j == K-2:
if string[j-1] == "-":
prev_position[j-1] = current_position[j]
else:
if string[j] == "-":
prev_position[j+1] = current_position[j]
elif string[j-1] == "-":
prev_position[j-1] = current_position[j]
else:
prev_position[j] = current_position[j]
current_position = prev_position
return current_position
def solution():
global answer
for i in range(K):
ch = chr(i+65)
if abs(before_ladder_result.index(ch) - after_ladder_result.index(ch)) > 1:
answer = "x" * (K-1)
return
for i in range(K-1):
if before_ladder_result[i] == after_ladder_result[i]:
answer.append("*")
elif i != K-1 and before_ladder_result[i] == after_ladder_result[i+1]:
answer.append("-")
elif i != 0 and before_ladder_result[i] == after_ladder_result[i-1]:
answer.append("*")
else:
answer = ["x"] * (K-1)
break
if __name__ == "__main__":
K = int(input())
N = int(input())
desired_answer = list(input().strip())
is_before_ladder = True
before_ladder = []
after_ladder = []
for _ in range(N):
string = input().strip()
if string[0] == "?":
is_before_ladder = False
else:
if is_before_ladder:
before_ladder.append(list(string))
else:
after_ladder.append(list(string))
answer = []
before_ladder_result = proceed()
after_ladder_result = reverse()
solution()
print("".join(answer))
다른 풀이를 참고해서, 함수의 구성은 그대로 두고 내부를 바꿔서 풀었다.
def proceed():
global start_ladder
for ladder in before_ladder:
for i in range(K-1):
if ladder[i] == "-":
start_ladder[i], start_ladder[i+1] = start_ladder[i+1], start_ladder[i]
def reverse():
global end_ladder
for ladder in after_ladder:
for i in range(K-1):
if ladder[i] == "-":
end_ladder[i], end_ladder[i+1] = end_ladder[i+1], end_ladder[i]
def solution():
global answer
for i in range(len(start_ladder)-1):
if start_ladder[i] == end_ladder[i]:
answer.append("*")
else:
if start_ladder[i] == end_ladder[i+1]:
answer.append("-")
elif i != 0 and start_ladder[i] == end_ladder[i-1]:
answer.append("*")
else:
answer = ["x" for _ in range(K-1)]
break
if __name__ == "__main__":
K = int(input())
N = int(input())
end_ladder = list(input().strip())
is_before_ladder = True
before_ladder = []
after_ladder = []
start_ladder = sorted(end_ladder)
for _ in range(N):
string = input().strip()
if string[0] == "?":
is_before_ladder = False
else:
if is_before_ladder:
before_ladder.append(list(string))
else:
after_ladder.append(list(string))
after_ladder.reverse()
answer = []
proceed()
reverse()
solution()
print("".join(answer))
'알고리즘' 카테고리의 다른 글
[백준/파이썬] #13023 (0) | 2025.05.25 |
---|---|
[백준/파이썬] #17836 (0) | 2025.05.20 |
[백준/파이썬] #21608 (0) | 2025.05.15 |
[백준/파이썬] #16927 (0) | 2025.05.11 |
[백준/파이썬] #2011 (0) | 2025.05.08 |