๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
์นดํ…Œ๊ณ ๋ฆฌ ์—†์Œ

[๋ฐฑ์ค€] 12026๋ฒˆ: BOJ ๊ฑฐ๋ฆฌ (Java)

by Lpromotion 2024. 8. 1.

๐Ÿ’ก๋ฌธ์ œ ๋ถ„์„ ์š”์•ฝ

1๋ถ€ํ„ฐ N๊นŒ์ง€ ๋ณด๋„๋ธ”๋Ÿญ์ด ์žˆ๊ณ  B, O, J ์ˆœ์„œ๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋‹ค. i๋ฒˆ์—์„œ I+1 ~ N๋ฒˆ๊นŒ์ง€ ์ด๋™ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ k์นธ ์ด๋™ํ•˜๋Š”๋ฐ k*k ์—๋„ˆ์ง€๊ฐ€ ํ•„์š”ํ•˜๋‹ค. 1๋ถ€ํ„ฐ N๊นŒ์ง€ ์ด๋™ํ•˜๋Š”๋ฐ ํ•„์š”ํ•œ ์ตœ์†Œํ•œ์˜ ์—๋„ˆ์ง€๋ฅผ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ์ด๋‹ค.

  • ์‹œ๊ฐ„ ์ œํ•œ: 2์ดˆ
  • ๋ฉ”๋ชจ๋ฆฌ ์ œํ•œ: 512MB

 

๐Ÿ’ก์•Œ๊ณ ๋ฆฌ์ฆ˜ ์„ค๊ณ„

๋ชจ๋“  ๊ฒฝ๋กœ๋ฅผ ํƒ์ƒ‰ํ•˜๋ฉฐ ์ตœ์†Œ ๊ฒฝ๋กœ ์ฐพ๋Š” ๋ฌธ์ œ ⇒ DP(๋™์ ๊ณ„ํš๋ฒ•)์˜ Bottom-Up ๋ฐฉ์‹

  • `dp` ๋ฐฐ์—ด์„ ํฐ ๊ฐ’์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•œ๋‹ค. (MAX๋กœ ์ดˆ๊ธฐํ™”)
    `dp[0]`์€ 0์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.
  • ํ˜„์žฌ ์œ„์น˜ i์— ๋Œ€ํ•ด, ์ด์ „์˜ ๋ชจ๋“  ์œ„์น˜ j(0~i-1)๋ฅผ ๊ฒ€์‚ฌํ•œ๋‹ค. (ํ˜„์žฌ: B→ ์ด์ „: J, O→B, J→ O)
    • ex) `street[i] == 'B' && street[j] == 'J'`
      : ํ˜„์žฌ ์œ„์น˜(i)๊ฐ€ 'B'์ด๊ณ  ์ด์ „ ์œ„์น˜(j)๊ฐ€ 'J'์ธ ๊ฒฝ์šฐ (J → B ์ด๋™)
    • B→O→J ์ˆœ์„œ๋กœ ์ด๋™ ๊ฐ€๋Šฅํ•˜๋ฉด, ์—๋„ˆ์ง€๋ฅผ ๊ณ„์‚ฐํ•˜๊ณ  ์ตœ์†Œ๊ฐ’์„ ๊ฐฑ์‹ ํ•œ๋‹ค. (`dp[i]`)
  • `dp[N-1]` ์„ ๊ฒฐ๊ณผ๊ฐ’์œผ๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
    ๋งŒ์•ฝ ์ดˆ๊ธฐ๊ฐ’๊ณผ ๊ฐ™์œผ๋ฉด -1์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

 

๐Ÿ’ก์ฝ”๋“œ

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

public class Main {
    static int N;
    static char[] street;
    static int MAX = 10000001;

    static void findMinEnergy() {
        int[] dp = new int[N];
        Arrays.fill(dp, MAX);
        dp[0] = 0;

        for(int i=1; i<N; i++) { // ํ˜„์žฌ ์œ„์น˜
            for(int j=0; j<i; j++) { // ์ด์ „ ์œ„์น˜
                if(street[i]=='B' && street[j]=='J'
                || street[i]=='O' && street[j]=='B'
                || street[i]=='J' && street[j]=='O') {
                    int energy = (i-j)*(i-j);
                    dp[i] = Math.min(dp[i], dp[j]+energy);
                }
            }
        }

        int result = dp[N-1] == MAX ? -1 : dp[N-1];
        System.out.println(result);
    }

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        N = Integer.parseInt(br.readLine());
        street = br.readLine().toCharArray();
        findMinEnergy();
    }
}

 

๐Ÿ’ก์‹œ๊ฐ„๋ณต์žก๋„

$O(N^2)$

 

๐Ÿ’ก ๋Š๋‚€์  or ๊ธฐ์–ตํ• ์ •๋ณด

๋ชจ๋“  ๊ฒฝ๋กœ๋ฅผ ํƒ์ƒ‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด์–ด์„œ ๋ฐ”๋กœ Bottom-Up ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์ง€๋งŒ, ๋ง‰์ƒ B→O→J ์ˆœ์„œ๋กœ ์ด๋™ ๊ฐ€๋Šฅํ•œ์ง€ ํ™•์ธํ•˜๊ณ  ์ตœ์†Ÿ๊ฐ’์„ ๊ณ„์‚ฐํ•ด์„œ ๋ฐฐ์—ด์„ ์ €์žฅํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ƒ๊ฐํ•˜๋Š” ๊ฒƒ์€ ์˜ค๋ž˜๊ฑธ๋ ธ๋‹คใ… 

๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€