๐ก๋ฌธ์ ๋ถ์ ์์ฝ
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]`)
- ex) `street[i] == 'B' && street[j] == 'J'`
- `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 ์์๋ก ์ด๋ ๊ฐ๋ฅํ์ง ํ์ธํ๊ณ ์ต์๊ฐ์ ๊ณ์ฐํด์ ๋ฐฐ์ด์ ์ ์ฅํ๋ ๋ฐฉ๋ฒ์ ์๊ฐํ๋ ๊ฒ์ ์ค๋๊ฑธ๋ ธ๋คใ
๋ฐ์ํ
๋๊ธ