QA & Engineering Blog

A Blog about Quality · Automation · Engineering

🏠 홈으로

[Silver II] 과일 탕후루 - 30804

문제 링크

성능 요약

메모리: 37160 KB, 시간: 172 ms

분류

구현, 브루트포스 알고리즘, 두 포인터

제출 일자

2025년 6월 30일 19:38:01

문제 설명

은하는 긴 막대에 N개의 과일이 꽂혀있는 과일 탕후루를 만들었습니다. 과일의 각 종류에는 1부터 9까지의 번호가 붙어있고, 앞쪽부터 차례로 S1,S2,,SN번 과일이 꽂혀있습니다. 과일 탕후루를 다 만든 은하가 주문을 다시 확인해보니 과일을 두 종류 이하로 사용해달라는 요청이 있었습니다.

탕후루를 다시 만들 시간이 없었던 은하는, 막대의 앞쪽과 뒤쪽에서 몇 개의 과일을 빼서 두 종류 이하의 과일만 남기기로 했습니다. 앞에서 a개, 뒤에서 b개의 과일을 빼면 Sa+1,Sa+2,,SNb1,SNb번 과일, 총 N(a+b)개가 꽂혀있는 탕후루가 됩니다. (0a,b; a+b<N)

이렇게 만들 수 있는 과일을 두 종류 이하로 사용한 탕후루 중에서, 과일의 개수가 가장 많은 탕후루의 과일 개수를 구하세요.

입력

첫 줄에 과일의 개수 N이 주어집니다. (1N200000)

둘째 줄에 탕후루에 꽂힌 과일을 의미하는 N개의 정수 S1,,SN이 공백으로 구분되어 주어집니다. (1Si9)

출력

문제의 방법대로 만들 수 있는 과일을 두 종류 이하로 사용한 탕후루 중에서, 과일의 개수가 가장 많은 탕후루의 과일 개수를 첫째 줄에 출력하세요.

💡 Solutions

📄 과일 탕후루.py

import sys
from collections import defaultdict

input = sys.stdin.readline
n = int(input())
fruit_list = list(map(int, input().split()))

def max_fruits(fruits):
    count = defaultdict(int)
    left = 0
    max_len = 0

    for right in range(len(fruits)):
        count[fruits[right]] += 1

        # 과일 종류가 3개 이상일 경우, 왼쪽 포인터 이동
        while len(count) > 2:
            count[fruits[left]] -= 1
            if count[fruits[left]] == 0:
                del count[fruits[left]]
            left += 1

        max_len = max(max_len, right - left + 1)

    return max_len

print(max_fruits(fruit_list))