본문 바로가기
알고리즘 문제 풀이

[백준 3745] 오름세

by 다빈치코딩 2024. 11. 9.

목차

    반응형

    문제 출처 : 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
    
    
    반응형

    '알고리즘 문제 풀이' 카테고리의 다른 글

    [백준 2631] 줄 세우기  (0) 2024.11.11
    [백준 2193] 이친수  (0) 2024.11.10
    [백준 11057] 오르막 수  (0) 2024.11.08
    [백준 2624] 동전 바꿔주기  (0) 2024.11.07
    [백준 17616] 등수 찾기  (0) 2024.11.03