본문 바로가기
Algorithm/Baekjoon

3745. 오름세 (Python)

by 원만사 2022. 3. 23.
반응형
 

3745번: 오름세

입력은 여러개의 테스트 케이스로 이루어져 있다. 각 테스트 케이스의 첫째 줄에는 주가를 관찰한 날의 수 N (N ≤ 100000)이 주어진다. 둘째 줄에는 관찰한 주가가 첫 날부터 순서대로 주어진다.

www.acmicpc.net

 

풀이

 간단하게 최장 증가 부분 수열(Longest Increasing Subsequence, LIS)을 활용하여 해결하는 문제이다. 문제 알고리즘 자체는 어려울게 없으나 입력에 따로 종료하는 부분이 주어지지 않아 그 부분만 해결하면 된다.

 파이썬에서는 try 구문을 사용하여 exception이 발생했을 때 입력이 종료되도록 해주면 된다.

 

코드

import sys
from bisect import bisect_left
input = sys.stdin.readline

if __name__ == '__main__':
    while True:
        try:
            N = int(input())  # 주가를 관찰한 날의 수
            prices = list(map(int, input().split()))  # 관찰한 주가

            dp = [1]  # 증가하는 부분 수열의 길이를 기록해 놓는 배열. 처음에는 길이 1을 넣어놓는다.
            array = [prices[0]]  # 가장 긴 증가 부분 수열의 수들을 기록해 놓는 배열. 처음 수를 기록해 놓는다.

            for i in range(1, N):
                # 현재 주가가 들어갈 수 있는 인덱스를 찾는다.
                idx = bisect_left(array, prices[i])

                # 만약 인덱스가 현재 배열의 길이와 같다면 증가하는 부분이 새롭게 추가된다는 의미다.
                if idx == len(dp):
                    dp.append(dp[-1] + 1)  # dp 배열에는 길이를 1 증가 시킨 값을 새로 넣고
                    array.append(prices[i])  # array 배열에는 새로운 주가를 추가한다.
                else:  # 배열에 주가가 이미 존재하는 위치에 값이 들어가야 한다면
                    array[idx] = prices[i]  # 해당 위치에 있는 주가를 현재의 주가로 바꾼다.

            print(dp[-1])  # dp 배열의 가장 마지막에 있는 값이 최장 증가 부분 수열의 길이에 해당한다.
        except:  # 더 이상 입력이 없는 경우에는 break 하도록 설정
            break

 

 

 

반응형

'Algorithm > Baekjoon' 카테고리의 다른 글

10159. 저울 (Python)  (0) 2022.04.02
4256. 트리 (Python)  (0) 2022.03.26
1949. 우수 마을 (Python)  (0) 2022.03.22
8980. 택배 (Python)  (0) 2022.03.21
18430. 무기 공학 (Python)  (0) 2022.03.19

댓글