본문 바로가기
알고리즘

[백준/파이썬] #2469

by 룰루루 2025. 5. 18.

약 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