ABOUT ME

Today
Yesterday
Total
  • 20922. [Python]겹치는 건 싫어
    Python_알고리즘/Silver I 2024. 7. 15. 12:50

    1. 문제

     

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

     

     

    2. 접근 방법

     

    • 시간 제한: 1초
    • 메모리 제한: 1024MB
    • 투 포인터

     

    3. 파이썬 코드

     

    N, K = map(int, input().split())
    num_list = list(map(int, input().split()))
    num_cnt = [0] * 100001
    # 시작
    left = 0
    # 끝
    right = 0
    # 최대 길이 체크
    max_length = 0
    # N까지 반복문 진행
    while right < N:
        # num_list 의 값 나올 때마다 1씩 증가
        num_cnt[num_list[right]] += 1
        # K 개보다 더 많이 나오는 경우
        if num_cnt[num_list[right]] > K:
            # max_length 값 갱신
            if max_length < right - left:
                max_length = right - left
            # num_cnt에서 num_list의 값이 K 보다 작을때까지 left 값증가하며 반복
            while num_cnt[num_list[right]] > K:
                num_cnt[num_list[left]] -= 1
                left += 1
        right += 1
    # 맨 마지막 리스트 순회에서 값 갱신
    else:
        if max_length < right - left:
            max_length = right - left
    print(max_length)

     

    4. 문제를 풀고난 후 생각

     

    • 연속 부분 수열이 무엇인지 헷갈려서 조금 찾아본 후 무슨 의미인지 깨닫는데 시간이 소요됨.
    • 기본적인 투 포인터 문제로 left 값을 언제 증가시킬지 생각을 해보면 쉽게 풀 수 있다.
    • K 개의 중복된 수를 허용하기 때문에 index 를 통해서 몇의 숫자가 몇번 나왔는지 체크하는 식으로 문제에 접근했으며 K 개를 넘는 숫자가 나온 경우 K 개 보다 적어질때까지 left 값을 증가시키며 숫자들을 빼는 식으로 문제를 풀었다.

     

    5. 문제를 푸는데 도움이 되는 지식

     

    • 투 포인터

    'Python_알고리즘 > Silver I' 카테고리의 다른 글

    14562. [Python]태권왕  (0) 2025.01.02
    14888. [Python]연산자 끼워넣기  (0) 2024.07.31
    2531. [Python]회전 초밥  (0) 2024.06.30
    1105. [Python]팔  (0) 2024.06.20
    11052. [Python]카드 구매하기  (0) 2024.05.20

    댓글

Designed by Tistory.