(python3)
2531번: 회전 초밥
첫 번째 줄에는 회전 초밥 벨트에 놓인 접시의 수 N, 초밥의 가짓수 d, 연속해서 먹는 접시의 수 k, 쿠폰 번호 c가 각각 하나의 빈 칸을 사이에 두고 주어진다. 단, 2 ≤ N ≤ 30,000, 2 ≤ d ≤ 3,000, 2 ≤
www.acmicpc.net
두포인터 혹은 슬라이딩 윈도우
윈도우 길이를 k로 유지하고 옆으로 한칸씩 이동시키면서 먹을 수 있는 가짓수를 확인합니다.
이 문제의 파이썬 풀이 10등이네요~ 와~
디테일한건 코드 주석으로 남기겠습니다.
코드
import sys
def solution(input) :
N,d,k,c = list(map(int,input().split()))
sushi = [int(input().strip()) for _ in range(N)]
ans = 0
CNT = [0]*(d+1) # 초밥종류마다 몇개씩 나왔는지
cnt = 0 # 초밥종류 몇개인지
for t in sushi[-1:-k-1:-1] : # 초기값 설정 (뒤쪽 k개)
if CNT[t] == 0 :
CNT[t]+=1
cnt+=1
else :
CNT[t]+=1
for i in range(N) : # i가 윈도우의 마지막 인덱스
if CNT[sushi[i]] == 0 : # 윈도우 마지막 원소 추가
cnt+=1
CNT[sushi[i]]+=1
if CNT[sushi[i-k]] == 1 : # 윈도우 첫 원소 제거
cnt-=1
CNT[sushi[i-k]]-=1
if CNT[c] == 0 : # 쿠폰 포함 가짓수로 최대값 구하기
ans = max(ans,cnt+1)
else :
ans = max(ans,cnt)
print(ans)
input = sys.stdin.readline
solution(input)
my solved.ac :
solved.ac
알고리즘 문제해결 학습의 이정표 🚩 Baekjoon Online Judge 문제들의 난이도 및 티어 정보를 제공하는 사이트입니다.
solved.ac
'Algorithem > 백준 PS with code' 카테고리의 다른 글
백준 #12919 - [G5] A와 B 2 : 거꾸로 해결하기/예외처리 (0) | 2023.07.08 |
---|---|
백준 #1522 - [S1] 문자열 교환 : 투포인터 (0) | 2023.07.07 |
백준 #17615 - [S1] 공 모으기 : 그리디 (0) | 2023.07.05 |
백준 #1446 - [S1] 지름길 : DP (0) | 2023.07.04 |
백준 #15989 - [S1] 1,2,3 더하기 4 : DP (0) | 2023.07.03 |