๋ฌธ์
ํ์ด
์ค๋๋ง์ ํธ๋ DP๋ฌธ์ ์๋ค. ๋จผ์ ์ถ๋ฅผ ๋ฃ์์ ๋ ๋ง๋ค ์ ์๋ ์ถ์ ๋ฌด๊ฒ๋ฅผ ์ ์ฅํ๊ธฐ ์ํ Cache๋ฐฐ์ด์ ์ ์งํ๋ค.
์ด ๋ ํด๋น ์ถ์ ๋ํด ๋ง๋ค ์ ์๋ ๊ฒฝ์ฐ ์๋ ๋ค์๊ณผ ๊ฐ๋ค.
- ํ์ฌ ์ถ๋ง ๋ฃ์ ๊ฒฝ์ฐ
- ์ด์ ๋จ๊ณ์์ ๋ง๋ค์๋ ๋ฌด๊ฒ๋ฅผ ๊ทธ๋๋ก ์ฌ์ฉํ๋ ๊ฒฝ์ฐ
- ์ด์ ๋จ๊ณ์์ ๋ง๋ค์๋ ๋ฌด๊ฒ์ ํ์ฌ ์ถ๋ฅผ ๋ํ๋ ๊ฒฝ์ฐ
- ์ด์ ๋จ๊ณ์์ ๋ง๋ค์๋ ๋ฌด๊ฒ์ ํ์ฌ ์ถ๋ฅผ ๋นผ๋ ๊ฒฝ์ฐ (๋ฌผ์ฒด์ชฝ์ ์ถ๋ฅผ ๋๋ ๊ฒฝ์ฐ)
์ต์ข ์ ์ผ๋ก ๋ง์ง๋ง ์ถ๋ฅผ ๋ฃ์์ ๋ ๊ฐ๋ฅํ ๋ฌด๊ฒ๋ฅผ ๊ตฌํ ์ ์๋ค.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
// Input ๋ฐ๊ธฐ ์ํ Buffered Reader
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// ์ถ์ ๊ฐ์ : N, ๋ฌด๊ฒ๋ฅผ ์ ค ๋ฌผ์ฒด์ ๊ฐ์ : M
static int N, M;
// ์ถ์ ์งํฉ : src , ๋ฌผ์ฒด์ ์งํฉ : dest
static int[] src, dest;
// ํด๋น ์ธ๋ฑ์ค์ ์ถ๋ฅผ ํตํด ๋ง๋ค ์ ์๋ ๋ฌด๊ฒ๋ฅผ ์ ์ฅ
static boolean[][] cache = new boolean[30][40001];
public static void main(String[] args) throws NumberFormatException, IOException {
// ์ถ์ ๊ฐ์
N = Integer.parseInt(br.readLine());
// ์ถ ๋ฐฐ์ด ์ด๊ธฐํ
src = new int[N];
// ์ถ ๋ฐฐ์ด ํ ๋น
String[] srcInput = br.readLine().split(" ");
for (int i = 0; i < N; i++) {
src[i] = Integer.parseInt(srcInput[i]);
}
// ๋ฌผ์ฒด์ ๊ฐ์
M = Integer.parseInt(br.readLine());
// ๋ฌผ์ฒด ๋ฐฐ์ด ์ด๊ธฐํ
dest = new int[M];
// ๋ฌผ์ฒด ๋ฐฐ์ด ํ ๋น
String[] destInput = br.readLine().split(" ");
for (int i = 0; i < M; i++) {
dest[i] = Integer.parseInt(destInput[i]);
}
// cache ๋ฐฐ์ด ๊ฐ ํ ๋น
makeCache();
// ์ถ๋ต
for (int i = 0; i < M; i++) {
// ๋ง๋ค ์ ์์ผ๋ฉด
if (isMakable(dest[i]))
System.out.print('Y' + " ");
// ๋ง๋ค ์ ์์ผ๋ฉด
else
System.out.print('N' + " ");
}
}
// ๋ง๋ค ์ ์๋ ๋ฌด๊ฒ์ธ์ง ํ์
private static boolean isMakable(int target) {
// ๋ง์ง๋ง ์ถ๊น์ง ๊ณ ๋ คํ์ ๋ ๋ง๋ค ์ ์๋ ๊ฒฝ์ฐ์ธ์ง ํ์ธ
return cache[N-1][target];
}
private static void makeCache() {
// ์ด์ ์ต๋๊ฐ์ ๊ธฐ์ตํ๊ธฐ ์ํ ๋ณ์ => ํ์ฌ ๋จ๊ณ์์ ์ต๋ ๋ฌด๊ฒ๋ ์ด์ ๋จ๊ณ์์ ๋ง๋ค ์ ์๋ ๋ฌด๊ฒ์ ์ต๋๊ฐ + ํ์ฌ ์์ ์ ๋ฌด๊ฒ
int prevMax = src[0];
// ์์ ๊ฐ ์ด๊ธฐํ => 0๋ฒ idx๋ ์์ ์ ๋ฃ๋ ๊ฒฝ์ฐ๋ง ๊ฐ๋ฅ
cache[0][src[0]] = true;
// 1๋ฒ idx๋ถํฐ ๋ง๋ค ์ ์๋ ๋ฌด๊ฒ๋ฅผ ํ์
for (int i = 1; i < N; i++) {
// ํ์ฌ ์ถ์ ๋ฌด๊ฒ
int curSrc = src[i];
// ํ์ฌ ์ถ๋ง ๋ฃ์์ ๋ ๋ง๋ค ์ ์๋ ๋ฌด๊ฒ
cache[i][curSrc] = true;
// ํ์ฌ ์ถ๋ฅผ ํตํด ๋ง๋ค ์ ์๋ ๋ฌด๊ฒ์ ์ต๋๊ฐ
int curMax = 0;
// ์ด์ ๋จ๊ณ์์ ๋ง๋ค์๋ ๋ฌด๊ฒ๋ฅผ ํตํด ํ์ฌ ๋จ๊ณ์์ ๋ง๋ค ์ ์๋ ๋ฌด๊ฒ ํ์ => ๋ชจ๋ ๋ฌด๊ฒ๋ฅผ ๋ ํ์๊ฐ ์๊ณ ์ด์ ๋จ๊ณ์ ์ต๋๋ฌด๊ฒ ์ ๊น์ง๋ง ํ์ํ๋ฉด ๋๋ค.
for (int j = 1; j <= prevMax; j++) {
// ์ด์ ์ ๋ง๋ค ์ ์๋ ๋ฌด๊ฒ์ธ ๊ฒฝ์ฐ Skip
if (!cache[i-1][j]) continue;
// ์ด์ ๋ฌด๊ฒ ๊ทธ๋๋ก ์ฌ์ฉํ๋ ๊ฒฝ์ฐ (ํ์ฌ ๋ฌด๊ฒ ์ฌ์ฉ X)
cache[i][j] = true;
// ์ด์ ๋ฌด๊ฒ + ํ์ฌ ๋ฌด๊ฒ
cache[i][j + curSrc] = true;
// ์ด์ ๋ฌด๊ฒ - ํ์ฌ ๋ฌด๊ฒ => ๋ฌด๊ฒ๋ฅผ ์ธก์ ํ๋ ค๋ ๋ฌผ์ฒด์ชฝ์ ์ถ๋ฅผ ๋ฃ๋ ๊ฒ๊ณผ ๋์ผํ ๊ฒฝ์ฐ
cache[i][Math.abs(j - curSrc)] = true;
// ์ต๋ ๋ฌด๊ฒ๋ ํญ์ ๋ํ ๊ฐ์ด๊ธฐ ๋๋ฌธ์ ๋ํ ๊ฐ์ผ๋ก ๊ฐฑ์
curMax = j + curSrc;
}
// ์ด์ ์ต๋๊ฐ ๊ฐฑ์
prevMax = curMax;
}
}
}
'๐ Algorithm > ๐ป ๋ฌธ์ ํ์ด' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฐฑ์ค] 1520. ๋ด๋ฆฌ๋ง๊ธธ (0) | 2021.04.01 |
---|---|
[๋ฐฑ์ค] - 2206. ๋ฒฝ๋ถ์๊ณ ์ด๋ํ๊ธฐ (0) | 2021.03.24 |
[๋ฐฑ์ค] - 1277. ๋ฐ์ ์ ์ค์น (0) | 2021.03.24 |
[๋ฐฑ์ค] 1799. ๋น์ (0) | 2021.03.07 |
[๋ฐฑ์ค] 1967. ํธ๋ฆฌ์ ์ง๋ฆ (0) | 2021.03.06 |
๋๊ธ