본문 바로가기
알고리즘/BOJ

[BOJ] 2493번 탑 / 사용언어 : 파이썬(python)

by 바른 호랑이 2022. 4. 4.
728x90
반응형

※ 문제링크

 

2493번: 탑

첫째 줄에 탑의 수를 나타내는 정수 N이 주어진다. N은 1 이상 500,000 이하이다. 둘째 줄에는 N개의 탑들의 높이가 직선상에 놓인 순서대로 하나의 빈칸을 사이에 두고 주어진다. 탑들의 높이는 1

www.acmicpc.net

해당 문제는 자료구조인 스택과 관련된 문제로 선입후출(FILO)의 개념을 활용하여 해결할 수 있는 문제였다. 3개의 리스트를 활용해 문제를 해결하였는데, 사실상 1개는 정답기록용으로 사용하였기에 실제 사용된 리스트는 2개라고 생각하면 될 것 같다. 기본 개념은 입력받은 타워의 높이를 하나의 리스트에 저장하고, 해당 값을 왼쪽부터 하나씩 꺼내서 다른 리스트에 쌓으며 비교를 반복하는 방식으로 해결하였으며, 조건에 부합하는 타워가 나타나면 바로 값을 기록해주기 위해 인덱스 값도 타워높이 값과 같이 쌓아가며해결하였다. 자세한 풀이방법과 코드는 아래와 같다.

1. 입력받은 타워의 높이를 리스트에 저장해준다.

2. 왼쪽 타워부터 하나씩 pop을 이용해 하나씩 꺼내면서, 다른 리스트에 쌓고, 반복문을 통해 기존 리스트의 가장 좌측값과 새로 쌓은리스트 값들을 비교하며, 조건에 부합하면 새로 쌓은 리스트에서 해당 값을 꺼내 갱신한다.

3. 명령문이 종료된 후 갱신시켜놓은 정답 리스트를 print문을 활용하여 출력한다.

 

# 값 입력파트
N = int(input())
towers = list(map(int, input().split()))

ans = [0 for i in range(N)] # 정답 기록용 리스트
stack = [] # 새로 타워의 높이와 인덱스를 기록할 리스트 생성

cnt = 0
while towers:
    t_num, t_index = towers.pop(), (N - cnt) # 기존 리스트에서 하나씩 꺼내기
    stack.append([t_num, t_index]) # 새 리스트에 타워높이와 인덱스 쌍 쌓기
    while stack:
        ele_num, ele_index = stack[-1]
        if len(towers) == 0: # 기존 타워가 비었으면 반복문 종료
            break
        elif ele_num <= towers[-1]: # 기존 타워의 가장 좌측값이 더 크면 정답 값 갱신
            ans[ele_index-1] = len(towers)
            stack.pop() # 갱신한 값을 기록한 새 리스트에서 제거
        else:
            break # 갱신할 수 없으면 반복문 종료
    cnt += 1
print(*ans)

 

P.S 더 나은 개발자가 되기위해 공부중입니다. 잘못된 부분을 댓글로 남겨주시면 학습하는데 큰 도움이 될 거 같습니다.

728x90
반응형

댓글