[BOJ] 30804. 과일 탕후루

2025. 7. 14. 22:40·BOJ

📌 문제 제목

문제 링크: 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)

 

'BOJ' 카테고리의 다른 글

[BOJ] 2579. 계단 오르기  (0) 2025.07.15
[BOJ] 9095. 1, 2, 3 더하기  (0) 2025.07.15
[BOJ] 1463. 1로 만들기  (0) 2025.07.15
[BOJ] 1806. 부분합  (0) 2025.07.14
[BOJ] 2230. 수 고르기  (0) 2025.07.14
'BOJ' 카테고리의 다른 글
  • [BOJ] 9095. 1, 2, 3 더하기
  • [BOJ] 1463. 1로 만들기
  • [BOJ] 1806. 부분합
  • [BOJ] 2230. 수 고르기
rubato.dev
rubato.dev
  • rubato.dev
    rubato.dev
    rubato.dev
  • 전체
    오늘
    어제
    • 분류 전체보기 (33) N
      • BOJ (28)
      • 알고리즘 (4)
      • TIL (0)
      • Project (1) N
  • 인기 글

  • 태그

    BOJ
    backtracking
    BFS
    PriorityQueue
    투 포인터
    DFS
    스택
    Next.js
    stack
    Zelda
    dp
    Algorithm
    Project
    PYTHON
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
rubato.dev
[BOJ] 30804. 과일 탕후루
상단으로

티스토리툴바