๐ฑ ๋ฌธ์
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 |
๋๊ธ