BOJ
[BOJ] 30804. 과일 탕후루
rubato.dev
2025. 7. 14. 22:40
📌 문제 제목
문제 링크: BOJ 30804
🗒️ 문제 설명
1부터 9까지의 과일 N개가 꽂혀있는 탕후루가 있을 때, 앞이나 뒤의 과일을 제거하여 최대 2종류의 과일만을 가지는 탕후루를 만들어라.
이때, 탕후루에 꽂혀있는 과일의 최대 개수를 구하여라.
시간 제한: 2초
메모리 제한: 1024MB
1 <= N <= 200,000
1 <= S_i <= 9
💡 문제 해결 아이디어
- N이 최대 200,000 이므로 시간복잡도가 O(N)의 알고리즘 사용
- 연속된 구간에서의 과일의 개수를 구하는 문제이므로 투 포인터를 사용
- 다음에 꽂아야 할 과일이 이미 꽂혀있지 않고 이미 종류가 2종류라면 break
⌛️ 시간 복잡도
- O(N)
- st는 시작점 포인터로 최대 N번 반복
- en은 끝점 포인터로 전체적으로 N번까지 증가
- 겉보기에는 이중 반복이지만, en은 한 번 증가하면 다시 줄어들지 않음. -> en은 전체 루프 동안 최대 N번
- O(2N) -> O(N)
✅ 최종 코드
import sys
input = sys.stdin.readline
N = int(input().strip())
seq = list(map(int, input().split()))
en = 0
fruits = [0] * 10
fruits[seq[0]] = 1
kind = 1
answer = 1
for st in range(N):
while en + 1 < N and kind <= 2:
if fruits[seq[en + 1]] == 0 and kind == 2:
break
en += 1
if fruits[seq[en]] == 0:
kind += 1
fruits[seq[en]] += 1
answer = max(answer, en - st + 1)
fruits[seq[st]] -= 1
if fruits[seq[st]] == 0:
kind -= 1
print(answer)