๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
์•Œ๊ณ ๋ฆฌ์ฆ˜

[Java] BOJ 30804 ๊ณผ์ผ ํƒ•ํ›„๋ฃจ

by ๐ŸŠ๊ทค๐ŸŠ 2024. 8. 17.

๋ฌธ์ œ 

๋ฌธ์ œ ๋งํฌ https://www.acmicpc.net/problem/30804

    • ์€ํ•˜๋Š” ๊ธด ๋ง‰๋Œ€์— N๊ฐœ์˜ ๊ณผ์ผ์ด ๊ฝ‚ํ˜€์žˆ๋Š” ๊ณผ์ผ ํƒ•ํ›„๋ฃจ๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.
    • ๊ณผ์ผ์˜ ๊ฐ ์ข…๋ฅ˜์—๋Š” 1๋ถ€ํ„ฐ 9๊นŒ์ง€์˜ ๋ฒˆํ˜ธ๊ฐ€ ๋ถ™์–ด์žˆ๊ณ , ์•ž์ชฝ๋ถ€ํ„ฐ ์ฐจ๋ก€๋กœ S1,S2,โ‹ฏ,SN๋ฒˆ ๊ณผ์ผ์ด ๊ฝ‚ํ˜€์žˆ์Šต๋‹ˆ๋‹ค.
    • ๊ณผ์ผ ํƒ•ํ›„๋ฃจ๋ฅผ ๋‹ค ๋งŒ๋“  ์€ํ•˜๊ฐ€ ์ฃผ๋ฌธ์„ ๋‹ค์‹œ ํ™•์ธํ•ด๋ณด๋‹ˆ ๊ณผ์ผ์„ ๋‘ ์ข…๋ฅ˜ ์ดํ•˜๋กœ ์‚ฌ์šฉํ•ด๋‹ฌ๋ผ๋Š” ์š”์ฒญ์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.
    • ์ด๋ ‡๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ๊ณผ์ผ์„ ๋‘ ์ข…๋ฅ˜ ์ดํ•˜๋กœ ์‚ฌ์šฉํ•œ ํƒ•ํ›„๋ฃจ ์ค‘์—์„œ, ๊ณผ์ผ์˜ ๊ฐœ์ˆ˜๊ฐ€ ๊ฐ€์žฅ ๋งŽ์€ ํƒ•ํ›„๋ฃจ์˜ ๊ณผ์ผ ๊ฐœ์ˆ˜๋ฅผ ๊ตฌํ•˜์„ธ์š”.
    • ํƒ•ํ›„๋ฃจ๋ฅผ ๋‹ค์‹œ ๋งŒ๋“ค ์‹œ๊ฐ„์ด ์—†์—ˆ๋˜ ์€ํ•˜๋Š”, ๋ง‰๋Œ€์˜ ์•ž์ชฝ๊ณผ ๋’ค์ชฝ์—์„œ ๋ช‡ ๊ฐœ์˜ ๊ณผ์ผ์„ ๋นผ์„œ ๋‘ ์ข…๋ฅ˜ ์ดํ•˜์˜ ๊ณผ์ผ๋งŒ ๋‚จ๊ธฐ๊ธฐ๋กœ ํ–ˆ์Šต๋‹ˆ๋‹ค.
    • ์•ž์—์„œ a๊ฐœ, ๋’ค์—์„œ b๊ฐœ์˜ ๊ณผ์ผ์„ ๋นผ๋ฉด Sa+1,Sa+2,โ‹ฏ,SN−b−1,SN−b๋ฒˆ ๊ณผ์ผ, ์ด N−(a+b)๊ฐœ๊ฐ€ ๊ฝ‚ํ˜€์žˆ๋Š” ํƒ•ํ›„๋ฃจ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. (0 ≤ a, b;
    • ์ฒซ ์ค„์— ๊ณผ์ผ์˜ ๊ฐœ์ˆ˜ N์ด ์ฃผ์–ด์ง‘๋‹ˆ๋‹ค. (1 ≤ N ≤ 200000)
    • ๋‘˜์งธ ์ค„์— ํƒ•ํ›„๋ฃจ์— ๊ฝ‚ํžŒ ๊ณผ์ผ์„ ์˜๋ฏธํ•˜๋Š” N๊ฐœ์˜ ์ •์ˆ˜ S1,โ‹ฏ,SN์ด ๊ณต๋ฐฑ์œผ๋กœ ๊ตฌ๋ถ„๋˜์–ด ์ฃผ์–ด์ง‘๋‹ˆ๋‹ค. (1 ≤ Si ≤ 9)

์•„์ด๋””์–ด

  • ๋์ ์„ ๊ธฐ์ค€์œผ๋กœ ๋์ ์„ ์ ์  ๋Š˜๋ ค๊ฐ€๋ฉด์„œ ๊ณผ์ผ์˜ ์ข…๋ฅ˜์™€ ๊ฐœ์ˆ˜๋ฅผ  HashMap์— ์ €์žฅํ•ด์ค€๋‹ค.
  • ๋์ ์„ ๋Š˜๋ ค, ๊ณผ์ผ์˜ ์ข…๋ฅ˜๋ฅผ ์ถ”๊ฐ€ํ–ˆ๋Š”๋ฐ ๊ณผ์ผ์˜ ์ข…๋ฅ˜๊ฐ€ 2 ์ดˆ๊ณผ๊ฐ€ ๋œ๋‹ค๋ฉด ์‹œ์ž‘์  ๊ณผ์ผ ์ข…๋ฅ˜์˜ ๊ฐœ์ˆ˜๋ฅผ 1๊ฐœ ๋นผ์ค€๋‹ค. (์‹œ์ž‘์ ์€ 0์œผ๋กœ ์‹œ์ž‘)
  • ๋งŒ์•ฝ ์‹œ์ž‘์ ์˜ ๊ณผ์ผ ๊ฐœ์ˆ˜๊ฐ€ 0๊ฐœ๋ผ๋ฉด, ๊ณผ์ผ ์ข…๋ฅ˜์—์„œ ์‹œ์ž‘์  ๊ณผ์ผ ์ข…๋ฅ˜๋ฅผ ์ œ๊ฑฐํ•ด์ค€๋’ค, ์‹œ์ž‘์ ์„ ์ฆ๊ฐ€์‹œํ‚จ๋‹ค.
  • ๊ทธ๋ฆฌ๊ณ  ํ˜„์žฌ์˜ ๋์ ๊ณผ ์‹œ์ž‘์  ๊ฐ„๊ฒฉ๊ณผ max๊ฐ’ ์ค‘ ๋” ํฐ ๊ฐ’์œผ๋กœ max๊ฐ’์„ ๊ฐฑ์‹ ํ•œ๋‹ค. (๋์ ๊ณผ ์‹œ์ž‘์ ์˜ ๊ฐ„๊ฒฉ์ด ๊ณผ์ผ์˜ ๊ฐœ์ˆ˜์ด๋ฏ€๋กœ)

๊ฒช์€ ์‹œํ–‰์ฐฉ์˜ค

  • ์ฒ˜์Œ์— ์‚ผ์ค‘ for๋ฌธ์„ ์จ์„œ ํˆฌํฌ์ธํ„ฐ ๋ฐฉ์‹์œผ๋กœ ํ’€์—ˆ๋‹ค๊ฐ€ ์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ€ ๋‚ฌ๋‹ค... (ํˆฌํฌ์ธํ„ฐ๋กœ ํ‘ผ๊ฒŒ ์•„๋‹ˆ์˜€๋‚˜...?)
  • ๊ทธ๋ž˜์„œ ์‹œ๊ฐ„์ดˆ๊ณผ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ๊ฐ€ ์กฐ๊ธˆ ํž˜๋“ค์—ˆ๋‹ค... ใ…œใ…œ

ํˆฌ ํฌ์ธํ„ฐ... ๊ธฐ์–ตํ•˜์ž...!

์ฝ”๋“œ

import java.io.*;
import java.util.*;

public class BOJ30804 {
    public static void main(String[] args) throws Exception{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        // ๊ณผ์ผ์˜ ๊ฐœ์ˆ˜
        int N = Integer.parseInt(br.readLine());

        StringTokenizer st = new StringTokenizer(br.readLine());

        // ๊ณผ์ผ์„ ๋„ฃ์–ด์ค„ ๋ฐฐ์—ด
        int arr[] = new int[N];

        for(int i = 0; i < N; i++){
            int n = Integer.parseInt(st.nextToken());

            arr[i] = n;
        }

        // ๊ณผ์ผ์˜ ๊ฐœ์ˆ˜ ์ตœ๋Œ“๊ฐ’์„ ์ €์žฅํ•  ๋ณ€์ˆ˜
        int max = Integer.MIN_VALUE;
        // ์‹œ์ž‘์ 
        int s = 0;
        // ๊ณผ์ผ์˜ ์ข…๋ฅ˜๋ฅผ ์ €์žฅํ•  HashMap (๊ณผ์ผ์˜ ์ข…๋ฅ˜์™€ ๊ฐœ์ˆ˜๋ฅผ ์ €์žฅ)
        HashMap<Integer, Integer> fruits = new HashMap<>();

        // ๋์ •
        for(int i = 0; i < N; i++){
            // ํ˜„์žฌ ๊ณผ์ผ์„ ๊ณผ์ผ ์ข…๋ฅ˜์— ์ถ”๊ฐ€ํ•˜๊ณ 
            // ๋งŒ์•ฝ ํ•ด๋‹น ๊ณผ์ผ์ด ์—†๋‹ค๋ฉด 0์— 1์„ ์ถ”๊ฐ€ํ•˜๊ณ 
            // ๊ธฐ์กด์— ์žˆ๋‹ค๋ฉด ๊ธฐ์กด ๊ฐ’์— 1์„ ๋”ํ•ด์„œ ์ €์žฅํ•จ
            fruits.put(arr[i], fruits.getOrDefault(arr[i], 0) + 1);

            // ๊ณผ์ผ์˜ ์ข…๋ฅ˜๊ฐ€ 2๊ฐœ ์ดˆ๊ณผ๊ฐ€ ๋œ๋‹ค๋ฉด
            while(fruits.size() > 2){
                // ์•ž์—์„œ๋ถ€ํ„ฐ ์—†์• ์•ผํ•˜๋ฏ€๋กœ
                // ์‹œ์ž‘์ ์˜ ๊ณผ์ผ ๊ฐœ์ˆ˜๋ฅผ 1๊ฐœ ์ค„์ž„
                fruits.put(arr[s], fruits.get(arr[s]) - 1);

                // ๋งŒ์•ฝ ์‹œ์ž‘์  ๊ณผ์ผ์˜ ์ข…๋ฅ˜ ๊ฐœ์ˆ˜๊ฐ€ 0์ด ๋œ๋‹ค๋ฉด
                // ํ•ด๋‹น ๊ณผ์ผ์˜ ์ข…๋ฅ˜๋ฅผ HashMap์—์„œ ์ œ๊ฑฐ
                if(fruits.get(arr[s]) == 0){
                    fruits.remove(arr[s]);
                }

                // ์‹œ์ž‘์ ์„ ์ฆ๊ฐ€์‹œํ‚ด
                s = s + 1;
            }

            // ํ˜„์žฌ ์ตœ๋Œ€๊ฐ’๊ณผ (๋์  - ์‹œ์ž‘์  + 1)ํ•œ ํฌ๊ธฐ์™€ ๋น„๊ตํ•ด์„œ
            // ๋” ํฐ ๊ฐ’์„ ์ตœ๋Œ€๊ฐ’์œผ๋กœ ๊ฐฑ์‹ 
            max = Math.max(max, i - s + 1);
        }

        System.out.println(max);
    }
}