Algorithem/백준 PS with code
백준 #2531 - [S1] 회전 초밥 : 두포인터
jamong5
2023. 7. 6. 11:07
(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