티스토리 뷰

문제

https://www.acmicpc.net/problem/2263

 

2263번: 트리의 순회

첫째 줄에 n(1 ≤ n ≤ 100,000)이 주어진다. 다음 줄에는 인오더를 나타내는 n개의 자연수가 주어지고, 그 다음 줄에는 같은 식으로 포스트오더가 주어진다.

www.acmicpc.net

풀이

후위 순위의 마지막 값을 출력하고 그 값을 기준으로 전위 순위를 왼쪽과 오른쪽으로 나누어 각각 재귀 함수를 실행시켰다.

 

처음에는 함수에 슬라이싱을 통해 새로운 리스트를 넘겨주었는데, 메모리 초과가 났다.

첫 번째 실패 코드

def find_pre_order(in_order: list, post_order: list):
    if not in_order:
        return

    print(post_order[-1], end=" ")

    idx = in_order.index(post_order[-1])

    find_pre_order(in_order[:idx], post_order[:idx])
    find_pre_order(in_order[idx + 1:], post_order[idx:-1])


n = int(input())
in_order = list(map(int, input().split()))
post_order = list(map(int, input().split()))
find_pre_order(in_order=in_order, post_order=post_order)

메모리 초과를 해결하기 위해서 새로운 리스트를 넘기는 대신 각 리스트의 인덱스만 넘기는 방식으로 변경하였다.

두 번째 실패 코드

import sys
sys.setrecursionlimit(10**9)


def find_pre_order(in_start, in_end, post_start, post_end):
    if in_start > in_end:
        return

    print(post_order[post_end], end=" ")
    idx = in_order.index(post_order[post_end])

    find_pre_order(in_start, idx - 1, post_start, post_start + idx - in_start - 1)
    find_pre_order(idx + 1, in_end, post_end - in_end + idx, post_end - 1)


n = int(input())
in_order = list(map(int, input().split()))
post_order = list(map(int, input().split()))
find_pre_order(0, n - 1, 0, n - 1)

이번에는 시간 초과가 났다.

매번 index() 메소드로 인덱스를 찾는 것은 비효율적이라고 생각해서 미리 인덱스를 리스트에 만들어놓고 찾는 방식으로 수정했다.

최종 코드

import sys
sys.setrecursionlimit(10**9)


def find_pre_order(in_start, in_end, post_start, post_end):
    if in_start > in_end:
        return

    print(post_order[post_end], end=" ")
    idx = in_order_idx[post_order[post_end]]

    find_pre_order(in_start, idx - 1, post_start, post_start + idx - in_start - 1)
    find_pre_order(idx + 1, in_end, post_end - in_end + idx, post_end - 1)


n = int(input())
in_order = list(map(int, input().split()))
post_order = list(map(int, input().split()))

in_order_idx = [0] * (n+1)
for i in range(n):
    in_order_idx[in_order[i]] = i
    
find_pre_order(0, n - 1, 0, n - 1)

'Problem Solving > 백준' 카테고리의 다른 글

백준 1005번 파이썬  (0) 2022.09.12
백준 10026번 파이썬  (0) 2022.07.03
백준 4256번 파이썬  (0) 2022.06.30
백준 3190번 파이썬  (0) 2022.06.29
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/06   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30
글 보관함