알고리즘 문제 풀이

[백준 3745] 오름세

다빈치코딩 2024. 11. 9. 21:04
반응형

문제 출처 : https://www.acmicpc.net/problem/3745

 

주식의 오름세를 찾는 문제 입니다. 점점 커지는 형태의 부분 수열을 찾는 문제로 LIS를 찾는 문제와 같습니다. LIS 라는 것만 알고 있다면 알고리즘을 이용하여 쉽게 문제를 해결 할 수 있습니다.

코드 작성

다른 함정이 없어 보이기 때문에 바로 문제를 해결해 보겠습니다. LIS를 해결할 때 속도도 빠르고 모듈을 사용하여 오류도 없을만한 이분탐색 bisect를 사용하겠습니다.

입력 받기

while True:
    try:
        N = int(input())
        arr = map(int, input().split()
    except:
        break

이 문제는 테스트 케이스의 개수가 존재하지 않습니다. 따라서 입력이 없으면 종료처리를 해야 합니다. 입력이 여러개인 문제의 경우 여러가지 해결 방안이 있겠지만 여기서는 간단하게 try except 문을 사용하겠습니다. 더 이상 입력이 없으면 예외처리로 break 문이 실행되고 while 문에서 빠져나오게 됩니다. try except 문에 대해 잘 모르겠다면 아래 링크를 통해 확인하시기 바랍니다.

https://wikidocs.net/192553

 

01. try except

[TOC] # try except 문 사용하기 try는 시도하다라는 뜻입니다. 먼저 시도해보고, 예외가 발생 했다면 except 문을 실행 합니다. ```python try:…

wikidocs.net

 

다음으로 주가가 관찰된 날 N과 관찰된 주가 arr을 입력 받습니다.

LIS 구하기

다음으로 LIS를 구해보겠습니다. LIS를 구하는 방법을 잘 모르겠다면 아래 링크를 통해 LIS 구하는 방식을 확인해 보시기 바랍니다.

https://wikidocs.net/263301

 

07. LIS(최장 증가 수열)

LIS는 Longest Increasing Subsequence의 약자로 최장 증가 수열 또는 최장 증가 부분수열이라고 합니다. LIS를 이해하기 위해서는 먼저 Increasin…

wikidocs.net

 

여기서는 LIS를 구하는 다양한 방법 중 가장 효율적인 이분 탐색을 사용해서 풀어보겠습니다.

    		lis = []
        for a in arr:
            idx = bisect_left(lis, a)
            if idx != len(lis):
                lis[idx] = a
            else:
                lis.append(a)
        
        print(len(lis))

빈 리스트 lis를 만듭니다. 다음으로 arr의 원소를 하나하나 탐색합니다. 해당 값 a가 lis에 들어갈 위치를 이분 탐색인 bisect_left 함수를 통해 구합니다. idx와 lis의 길이가 같으면 a값을 lis에 추가하고, 두 값이 다르다면 idx 위치에 a를 넣어줍니다. 최종적으로 lis의 길이를 구해 그 길이를 출력할 수 있습니다.

전체 코드

전체 코드를 확인해 보겠습ㅈ니다.

from bisect import *

while True:
    try:
        N = int(input())
        arr = map(int, input().split())
        lis = []
        for a in arr:
            idx = bisect_left(lis, a)
            if idx != len(lis):
                lis[idx] = a
            else:
                lis.append(a)
        
        print(len(lis))
        
    except:
        break

반응형