๋ฌธ์
๋ฌธ์ ๋งํฌ https://www.acmicpc.net/problem/11723
- ๋ฏผํธ๋ ์ ๊ณต์ฑ ์ ๋ชฉ์ ์๋ ๊ธ์๋ค์ ์ค๋ ค์ ๋จ์ด ๋ง๋ค๊ธฐ ๋์ด๋ฅผ ํ๋ ค๊ณ ํ๋ค.
- ๋จ์ด ๋ง๋ค๊ธฐ ๋์ด๋ ์๋ ์์์ ๊ฐ๋ค.
- 1๋ฒ ์ฑ : COMPUTERARCHITECTURE (35,000์)
- 2๋ฒ ์ฑ : ALGORITHM (47,000์)
- 3๋ฒ ์ฑ : NETWORK (43,000์)
- 4๋ฒ ์ฑ : OPERATINGSYSTEM (40,000์)
- ๋ง์ฝ ๋ฏผํธ๊ฐ ๋ง๋ค๊ณ ์ถ์ ๋จ์ด๊ฐ ALMIGHTY๋ผ๊ณ ํ๋ฉด, ์ 4๊ฐ์ ์ฑ ์ค, 1๋ฒ ์ฑ ์์ A๋ฅผ, 2๋ฒ ์ฑ ์์ L, M, I, G, H, T๋ฅผ, 4๋ฒ ์ฑ ์์ Y๋ฅผ ์ค๋ ค๋ด์ด ์ํ๋ ๋จ์ด๋ฅผ ๋ง๋ค ์ ์๋ค.
- ์ด๋ ๋๋ ๋น์ฉ์ 1๋ฒ, 2๋ฒ, 4๋ฒ ์ฑ ๊ฐ๊ฒฉ์ ํฉ์ธ 122,000์์ด๋ค.
- ๋ง์ฝ ANT๋ผ๋ ๋จ์ด๋ฅผ ๋ง๋ค๊ณ ์ถ๋ค๊ณ ํ๋ฉด, 2๋ฒ ์ฑ ์์ A๋ฅผ, 3๋ฒ ์ฑ ์์ N, T๋ฅผ ์ค๋ ค๋ด์ด ์ํ๋ ๋จ์ด๋ฅผ ๋ง๋ค ์ ์๋ค. ์ด๋ ๋๋ ๋น์ฉ์ 2๋ฒ๊ณผ 3๋ฒ ์ฑ ๊ฐ๊ฒฉ์ ํฉํ์ฌ 90,000์์ด๋ค.
- ๊ทธ๋ฐ๋ฐ, ANT๋ผ๋ ๋จ์ด์์ A๋ฅผ 2๋ฒ ์ฑ ์์ ์ค๋ ค๋ด์ง ์๊ณ , 4๋ฒ ์ฑ ์ ์๋ A๋ฅผ ์ค๋ ค๋ผ ์๋ ์๋ค. ๋ง์ฝ 4๋ฒ ์ฑ ์์ A๋ฅผ ์ค๋ ค๋์ ๋ ๋๋ ๋น์ฉ์ 3๋ฒ๊ณผ 4๋ฒ ์ฑ ๊ฐ๊ฒฉ์ ํฉํ์ฌ 83,000์์ผ๋ก 2๋ฒ๊ณผ 3๋ฒ ์ฑ ์ ๊ณ ๋ฅธ ๋น์ฉ๋ณด๋ค ์๋ค.
- ํ์ง๋ง, 4๋ฒ ์ฑ ์๋ ANT๊ฐ ๋ชจ๋ ํฌํจ๋์ด ์์ผ๋ฏ๋ก, 4๋ฒ ์ฑ ๋ง ์ ํํ์ ๋ ๋๋ ๋น์ฉ์ด 40,000์์ด๋ค.
- ์ด๋ ANT๋ผ๋ ๋จ์ด๋ฅผ ๋ง๋ค๊ธฐ ์ํด์ ๊ฐ์ฅ ์ ์ ๋น์ฉ์ด๋ค.
- ๋ฏผํธ๋ ๊ฐ์ฅ ์ ์ ๋น์ฉ์ผ๋ก ์์ ์ด ์ํ๋ ๋จ์ด๋ฅผ ๋ง๋ค๋ ค๋ฉด ์ด๋ค ์ ๊ณต์ฑ ๋ค์ ์ ํํด์ผ ํ๋์ง ๊ถ๊ธํ๋ค.
- ๋ฏผํธ๋ฅผ ๋์ ๊ฐ ์ ๊ณต์ฑ ์ ๊ฐ๊ฒฉ๊ณผ ์ ๋ชฉ์ด ์ฃผ์ด์ก์ ๋, ๊ฐ์ฅ ์ ์ ๋น์ฉ์ผ๋ก ๋ฏผํธ๊ฐ ์ํ๋ ๋จ์ด๋ฅผ ๋ง๋ค๊ธฐ ์ํด์ ์ด๋ค ์ ๊ณต์ฑ ์ ์ ํํด์ผ ํ๋์ง ์์๋ณด์.
- ์ฒซ ๋ฒ์งธ ์ค์๋ ๋ฏผํธ๊ฐ ๋ง๋ค๊ณ ์ ํ๋ ๋จ์ด๋ฅผ ์๋ฏธํ๋ ๋ฌธ์์ด T (1 ≤ |T| ≤ 10)๊ฐ ์ฃผ์ด์ง๋ค. T๋ ํญ์ ๋๋ฌธ์์ด๋ฉฐ, |T|๋ ๋ฌธ์์ด T์ ๊ธธ์ด๋ฅผ ์๋ฏธํ๋ค.
- ๋ ๋ฒ์งธ ์ค์๋ ๋ฏผํธ๊ฐ ๊ฐ์ง ์ ๊ณต์ฑ ์ ๊ฐ์๋ฅผ ์๋ฏธํ๋ ์ ์ N (1 ≤ N ≤ 16)์ด ์ฃผ์ด์ง๋ค.
- ๋ค์ N๊ฐ์ ๊ฐ ์ค์๋ ์ ๊ณต์ฑ ๊ฐ๊ฒฉ์ ์๋ฏธํ๋ ์ ์ Ci (10,000 ≤ Ci ≤ 100,000)์ ์ ๋ชฉ์ ์๋ฏธํ๋ ๋ฌธ์์ด Wi (1 ≤ |Wi| ≤ 50)๊ฐ ์ฃผ์ด์ง๋ค. Wi๋ ํญ์ ๋๋ฌธ์์ด๋ค.
- ๋ฏผํธ๊ฐ ์ํ๋ ๋จ์ด T๋ฅผ ๋ง๋ค๊ธฐ ์ํด์ ์ ํํด์ผ ํ๋ ์ ๊ณต์ฑ ์ ๊ฐ์ฅ ์ ์ ๊ฐ๊ฒฉ์ ํฉ์ ์ถ๋ ฅํ๋ค. ๋ง์ฝ ๋จ์ด๋ฅผ ๋ง๋ค ์ ์๋ค๋ฉด -1์ ์ถ๋ ฅํ๋ค.
์์ด๋์ด
- ์ฐ์ ์ฑ ๊ฐ๊ฒฉ๊ณผ ์ ๋ชฉ์ ์ ๋ ฅ๋ฐ๊ณ DFS๋ฅผ ํตํด ์ฑ ์ ์กฐํฉ์ ์งฐ๋ค.
- ๊ทธ๋ฆฌ๊ณ ํด๋น ์ฑ ์กฐํฉ์ ์ ๋ชฉ๋ค์์ HashMap์ ํ์ฉํ์ฌ ๊ธ์์ ํด๋น ๊ธ์์ ๊ฐฏ์๋ฅผ ์ ์ฅํ๋ค.
- ๊ทธ๋ฆฌ๊ณ ์ฐพ์์ผ๋๋ ๋ฌธ์์ด์ ์๋ ๋ฌธ์์ ํด๋น ๋ฌธ์์ ๊ฐฏ์๋ฅผ HashMap์ ์ ์ฅํ๋ค.
- ๊ทธ๋ฆฌ๊ณ ์ฐพ์์ผ๋๋ ๋ฌธ์๋ฅผ key๋ก ๊ธฐ์ค์ผ๋ก ์ฑ ์กฐํฉ์ ์ ๋ชฉ๋ค์ ๊ธ์์ ๊ธ์์๋ฅผ ์ ์ฅํ HashMap์์ value ๊ฐ์ ์ฐพ๊ณ , ์ฐพ์์ผ๋๋ ๋ฌธ์์ด์ ๋ฌธ์์ ๊ฐฏ์๋ฅผ ์ ์ฅํ HashMap์ ์ ์ฅ๋ value๋ณด๋ค ์๊ฑฐ๋ ํด๋น key๊ฐ์ด ์์ผ๋ฉด ํด๋น ์ฑ ์กฐํฉ์์ ์ฐพ์์ผ๋๋ ๋ฌธ์์ด์ ์ฐพ์ ์ ์๋ค๋ ๋ป์ด๋ฏ๋ก ๋์ด๊ฐ๋ค.
- ๋ง์ฝ ์ฐพ์ ์ ์๋ค๋ฉด ํด๋น ๋ฌธ์์ด์ ์ฐพ์ ์ ์๋ค๋ ๋ป์ด๋ฏ๋ก ์ต์๊ฐ์ ๊ฐฑ์ ํ ์ ์์ ๊ฒฝ์ฐ, ์ต์๊ฐ์ ๊ฐฑ์ ํ๋ค.
๊ฒช์ ์ํ์ฐฉ์ค
- ๋ญ๊ฐ.. ๋ฌธ์ ๋ฅผ ๋๋ฌด ์ด๋ ต๊ฒ ํผ๊ฑฐ ๊ฐ๋ค... ์ข ์ฝ๊ฒ ํธ๋ ๋ฐฉ๋ฒ์ด ์์์ ๊ฒ ๊ฐ์๋ฐ... ์ฐพ์๋ด์ผ๊ฒ ๋ค..
์ฝ๋
import java.io.*;
import java.util.*;
public class BOJ16508 {
static public int[] cost;
static public boolean[] visited;
static public String[] books;
static public int N;
static public String s;
static public int result;
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// ๋ง๋ค ๊ธ์
s = br.readLine();
// ์ฑ
์
N = Integer.parseInt(br.readLine());
// ๊ฐ๊ฒฉ ์ ์ฅํ ๋ฐฐ์ด
cost = new int[N];
// ๊ฐ๊ฒฉ์ด๋ ์ฑ
์ด๋ฆ์ ์ ์ฅํ ๋ฐฐ์ด
books = new String[N];
// ์ฑ
์กฐํฉ์ ๋ง๋ค ๋ ์ธ, ๋ฐฉ๋ฌธ ์ฌ๋ถ
visited = new boolean[N];
for (int i = 0; i < N; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
// ๊ฐ๊ฒฉ
cost[i] = Integer.parseInt(st.nextToken());
// ์ฑ
์ด๋ฆ
books[i] = st.nextToken();
}
// ๊ฒฐ๊ณผ๊ฐ ์ด๊ธฐํ
result = Integer.MAX_VALUE;
// ์ฑ
์กฐํฉ์ ํตํด ์ต์ ๋น์ฉ์ ์ฐพ์
for (int i = 1; i <= N; i++) {
int[] arr = new int[i];
DFS(0, i, arr);
}
// ๊ฒฐ๊ณผ๊ฐ์ด ๊ฐฑ์ ๋์ง ์์๋ค๋ฉด -1 ์ถ๋ ฅ
if (result == Integer.MAX_VALUE) {
System.out.println(-1);
} else {
System.out.println(result);
}
}
// DFS ํ์
public static void DFS(int depth, int limit, int[] pri) {
if (depth == limit) {
// ์ ํํ ์ฑ
์กฐํฉ์ ๊ฐ๊ฒฉ๊ณผ ๊ธ์ ๋งค์นญ ์ํ
checkWords(pri);
return;
}
// ์ค๋ณต ์กฐํฉ ๋ฐฉ์ง (ํ์ฌ depth์ ์ด์ ์ธ๋ฑ์ค๋ณด๋ค ํฐ ์ธ๋ฑ์ค๋ง ํ์)
for (int i = (depth == 0) ? 0 : pri[depth - 1] + 1; i < N; i++) {
if (!visited[i]) {
visited[i] = true;
pri[depth] = i;
DFS(depth + 1, limit, pri);
visited[i] = false;
}
}
}
// ์ ํํ ์ฑ
์กฐํฉ์ผ๋ก ์ต์ ๋น์ฉ ์ฐพ๊ธฐ
public static void checkWords(int[] pri) {
// ์ฐพ์์ผ ํ๋ ๋ฌธ์์ ๊ฐฏ์๋ฅผ ์ ์ฅํ HashMap
HashMap<Character, Integer> targetCount = new HashMap<>();
// ์ฐพ์์ผํ๋ ๋ฌธ์์ด์์ ๊ธ์๋ฅผ ํค๋ก ํ์ฌ ๊ทธ ๋ฌธ์์ ๊ฐฏ์๋งํผ value๊ฐ์ ๊ฐฑ์
for (char c : s.toCharArray()) {
targetCount.put(c, targetCount.getOrDefault(c, 0) + 1);
}
// ์กฐํฉ๋ ์ฑ
๋ค์ ๋ฌธ์์ ๊ฐฏ์๋ฅผ ์ ์ฅํ HashMap
HashMap<Character, Integer> currentCount = new HashMap<>();
// ์ฑ
์ ์ด ๊ฐ๊ฒฉ
int totalPrice = 0;
// ์กฐํฉ๋ ์ฑ
๋ฐฐ์ด์ ์ด ๊ฐ๊ฒฉ์ ๊ณ์ฐํ๊ณ
for (int i : pri) {
totalPrice += cost[i];
// ํด๋น ์ ๋ชฉ๋ค์ ์๋ ๋ฌธ์๋ฅผ key๊ฐ์ผ๋ก ํ์ฌ ๊ทธ ๋ฌธ์์ ๊ฐ์๋ฅผ value๋ก ์ ์ฅ
for (char c : books[i].toCharArray()) {
// ํด๋น ๋ฌธ์๊ฐ ์ด๋ฏธ HashMap์ key๊ฐ์ผ๋ก ์์ผ๋ฉด ๊ธฐ์ค value๊ฐ์ 1์ ๋ํ ๊ฐ์
// value๊ฐ์ผ๋ก ์ ์ฅํ๊ณ ์๋ค๋ฉด 1์ ์ ์ฅ
currentCount.put(c, currentCount.getOrDefault(c, 0) + 1);
}
}
// ๋ชฉํ ๊ธ์๊ฐ ๋ชจ๋ ํฌํจ๋์ด ์๋์ง ํ์ธ
boolean canMake = true;
for (char key : targetCount.keySet()) {
// ๋ง์ฝ ์ฐพ์์ผ๋๋ ๋ฌธ์์ ๊ฐฏ์๊ฐ
// ์ฑ
์ ๋ชฉ์ ์กฐํฉ์์ ์ฐพ์ ๋ฌธ์์ ๊ฐฏ์๋ณด๋ค ์๊ฑฐ๋ ํด๋น ๋ฌธ์๋ฅผ
// key ๊ฐ์ผ๋ก ์ฐพ์ ์ ์๋ค๋ฉด
if (currentCount.getOrDefault(key, 0) < targetCount.get(key)) {
// ๋ชฉํ ๊ธ์๋ฅผ ๋ชจ๋ ๋ชป ์ฐพ์ผ๋ฏ๋ก false๋ก ๋ณํ
canMake = false;
break;
}
}
// ๋ชฉํ ๋ฌธ์๋ฅผ ๋ง๋ค ์ ์๋ค๋ฉด, ๊ฐ๊ฒฉ ๊ฐฑ์
if (canMake) {
result = Math.min(result, totalPrice);
}
}
}
'์๊ณ ๋ฆฌ์ฆ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Java] BOJ 2635 ์ ์ด์ด๊ฐ๊ธฐ (0) | 2024.12.12 |
---|---|
[Java] BOJ 5567 ๊ฒฐํผ์ (2) | 2024.12.11 |
[Java] BOJ 15663 N๊ณผ M (9) (0) | 2024.12.11 |
[Java] BOJ 2371 ํ์ผ ๊ตฌ๋ณํ๊ธฐ (2) | 2024.12.09 |
[Java] BOJ 7662 ์ด์ค ์ฐ์ ์์ ํ (2) | 2024.09.07 |