๐ฑ ๋ฌธ์
https://www.acmicpc.net/problem/2531
๐ฑ ํ์ด
0. ์ ๋ ฅ๋ฐ๊ธฐ
input = sys.stdin.readline
n, d, k, c = map(int, input().split())
belt = []
for _ in range(n):
belt.append(int(input()))
*์ฒ์ ์๊ฐํ๋ ๋ฐฉ๋ฒ (์๊ฐ ์ด๊ณผ ๋ฐ์)
์ต๋ ์ ์ ์๋ 30,000๊ฐ์ด๋๊น ๋ธ๋ฃจํธ ํฌ์ค๋ก ์ถฉ๋ถํ ๊ฐ๋ฅํ๋ค๊ณ ์๊ฐํ์ต๋๋ค. ๋ฆฌ์คํธ๋ฅผ ๋๋ฉด์ ์ด๋ฐฅ์ ์ข ๋ฅ๋ง ์ธ์ฃผ๋ฉด ๋๋ค!ํ๊ณ ์๋์ ๊ฐ์ด ์ฝ๋๋ฅผ ์งฐ๋๋ฐ ์๊ฐ์ด๊ณผ๊ฐ ๋ฐ์ํ์์ต๋๋ค.
answer = 0
for i in range(n):
belt.append(belt.popleft())
answer = max(len(set(list(belt)[:k] + [c])), answer)
print(answer)
๊ทธ ์ด์ ๋ ์ฐ์ for๋ฌธ์ด $O(N)$์ ์๊ฐ ๋ณต์ก๋๋ฅผ ๊ฐ์ง๊ณ $list(belt)[:k]$์์ ๋ฆฌ์คํธ๋ก ๋ณํ ํ ์ฌ๋ผ์ด์ฑํ๋๋ฐ์์ $O(k)$ ์๊ฐ๋ณต์ก๋๋ฅผ ๊ฐ์ง๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ฆฌ์คํธ๋ฅผ set๋ก ๋ณํํ๋๋ฐ์๋ $O(k)$์ ์๊ฐ๋ณต์ก๋๋ฅผ ๊ฐ์ง๋ฏ๋ก ์ต์ข ์ ์ผ๋ก for๋ฌธ ์์์ $O(k)$ ์๊ฐ๋ณต์ก๋๊ฐ ๋ฐ์ํ๋ ๊ฒ์ ๋๋ค. ๋ฐ๋ผ์ ์์ ์ฝ๋์ ์ ์ฒด ์๊ฐ๋ณต์ก๋๋ $O(n * k)$๊ฐ ๋ฉ๋๋ค.
1. ํฌํฌ์ธํฐ(์ฌ๋ผ์ด๋ฉ ์๋์ฐ) ์ฌ์ฉํ๊ธฐ
์์ ์๊ฐ ์ด๊ณผ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์๋ ํฌํฌ์ธํฐ(์ฌ๋ผ์ด๋ฉ ์๋์ฐ) ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํด์ผํฉ๋๋ค.
window = defaultdict(int)
์ฐ์ defaultdict
๋ก ๋์
๋๋ฆฌ๋ฅผ ํ๋ ๋ง๋ญ๋๋ค. ์ด ๋์
๋๋ฆฌ๋ ์ด๋ฐฅ์ ์ข
๋ฅ๋ฅผ ์ธ๊ธฐ ์ํ ๋์
๋ฌ๋์
๋๋ค.
2. ์๋์ฐ ์ด๊ธฐํ
# Initialize the first window
for i in range(k):
window[belt[i]] += 1
# Add the coupon sushi
window[c] += 1
answer = len(window)
์ฒซ๋ฒ์งธ ์๋์ฐ๋ฅผ ์ค์ ํฉ๋๋ค. ์ฒซ๋ฒ์งธ ์ด๋ฐฅ๋ถํฐ k
๊ฐ๋ฅผ ์ฐ์์ผ๋ก ๋จน๊ณ ์ฟ ํฐ ์ด๋ฐฅ๊น์ง ๋จน์์ ๋์ ์ด๋ฐฅ์ ์ข
๋ฅ๋ฅผ ๊ตฌํฉ๋๋ค.
3. ํฌํฌ์ธํฐ ์ฎ๊ธฐ๊ธฐ
# Slide the window across the belt
for i in range(1, n + 1):
# Remove the sushi that goes out of the window
window[belt[i - 1]] -= 1
if window[belt[i - 1]] == 0:
del window[belt[i - 1]]
# Add the new sushi that enters the window
window[belt[(i + k - 1) % n]] += 1
# Update the maximum number of unique sushis
answer = max(len(window), answer)
print(answer)
for
๋ฌธ์ผ๋ก belt
๋๊น์ง ๋๋ฉด์ ์ผ์ชฝ ์ด๋ฐฅ ํ๋๋ ๋นผ๊ณ ์ค๋ฅธ์ชฝ ์ด๋ฐฅ ํ๋๋ ๋ํด๊ฐ๋ฉด์ ์ด๋ฐฅ์ ์ข
๋ฅ๋ฅผ ์ธ์ answer
์๋ ์ต๋๊ฐ์ด ๋ค์ด๊ฐ๋๋ก ํฉ๋๋ค.
์ด๋ ๊ฒ ์ฝ๋๋ฅผ ์ง๊ฒ ๋๋ฉด for๋ฌธ ์์์๋ ๋ชจ๋ ์ฝ๋์ ์๊ฐ๋ณต์ก๋๊ฐ $O(1)$์ด ๋๊ธฐ ๋๋ฌธ์ ์ ์ฒด ์ฝ๋๋ $O(N)$์ ์๊ฐ๋ณต์ก๋๋ฅผ ๊ฐ์ง๋๋ค.
๐ฑ ์ ๋ต ์ฝ๋
# !/usr/bin/env python
# -*- coding: utf-8 -*-
# boj 2531 ํ์ ์ด๋ฐฅ
import sys
from collections import defaultdict
input = sys.stdin.readline
n, d, k, c = map(int, input().split())
belt = []
for _ in range(n):
belt.append(int(input()))
current_window = defaultdict(int)
for i in range(k):
current_window[belt[i]] += 1
current_window[c] += 1
answer = len(current_window)
for i in range(1, n):
current_window[belt[i - 1]] -= 1
if current_window[belt[i - 1]] == 0:
del current_window[belt[i - 1]]
current_window[belt[(i + k - 1) % n]] += 1
answer = max(answer, len(current_window))
print(answer)
'Algorithm > BOJ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[BOJ] #10830 ํ๋ ฌ ์ ๊ณฑ (Python, ๋ถํ ์ ๋ณต) (0) | 2024.08.03 |
---|---|
[BOJ] #5430 AC (Python, Deque, ์๊ฐ ์ด๊ณผ ํด๊ฒฐ) (0) | 2024.07.13 |
[BOJ] #2437 ์ ์ธ (Python, Greedy) (0) | 2023.03.19 |
[BOJ] #11000 ๊ฐ์์ค ๋ฐฐ์ (Python, ์ฐ์ ์์ ํ, ๊ทธ๋ฆฌ๋) (2) | 2023.03.17 |
[BOJ] #16724 ํผ๋ฆฌ ๋ถ๋ ์ฌ๋์ด (0) | 2023.03.14 |
๋๊ธ