코딩테스트/⚪백준_ 단계별로 풀어보기

[Python][투포인터] 20922번 겹치는 건 싫어

1son 2023. 6. 29. 16:31

🔗문제링크 

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

 

20922번: 겹치는 건 싫어

홍대병에 걸린 도현이는 겹치는 것을 매우 싫어한다. 특히 수열에서 같은 원소가 여러 개 들어 있는 수열을 싫어한다. 도현이를 위해 같은 원소가 $K$개 이하로 들어 있는 최장 연속 부분 수열

www.acmicpc.net

 

 

 

 

주어진 리스트에서 서로 다른 숫자의 개수가 최대 k개가 되는

연속 부분 배열의 최대 길이를 구하는 문제

 

즉, 겹치지 않는 숫자의 최대 길이를 계산하여 출력하는 코드

from collections import defaultdict

def max_non_repeating_length(n, k, nums):
    counts = defaultdict(int)
    left = 0
    max_length = 0

    for right in range(n):
        counts[nums[right]] += 1

        while counts[nums[right]] > k:
            counts[nums[left]] -= 1
            left += 1

        max_length = max(max_length, right - left + 1)

    return max_length

n, k = map(int, input().split())
nums = list(map(int, input().split()))

result = max_non_repeating_length(n, k, nums)
print(result)

 

💡defaultdict는 무엇인가? 

 

: defaultdict는 일반적인 딕셔너리(dictionary)와 비슷하지만, 키(key)에 대한 기본값을 지정할 수 있습니다.

defaultdict를 사용하면 존재하지 않는 키에 접근할 때에도 KeyError가 발생하지 않고, 기본값을 반환합니다.

기본값은 defaultdict를 생성할 때 지정되며, 주로 내장 데이터 타입 (예: int, list, set) 또는 사용자 정의 함수를

기본값으로 사용합니다.

 

 

 

💡굳이 이 코드에서 그냥 dic이 아니라 defaultdic을 사용한 이유는?

 

: defaultdict을 사용한 이유는 코드에서 counts 딕셔너리의 초기값을 0으로 설정하기 위해서입니다.

-> 일반적인 딕셔너리(dict)의 경우, 존재하지 않는 키에 접근하면 KeyError가 발생합니다.

-> 하지만 defaultdict을 사용하면 초기값을 지정해줌으로써,

    존재하지 않는 키에 접근하더라도 오류가 발생하지 않고 초기값을 반환합니다.

 

이 코드에서 counts 딕셔너리는 각 숫자의 등장 횟수를 기록하는 용도로 사용됩니다.

 defaultdict(int)를 사용하여 생성하면, 처음 등장하는 숫자의 횟수를 1로 설정하고,

이미 등장한 숫자의 횟수를 1씩 증가시킬 수 있습니다.