๐๋ฌธ์ ํ์ํ๊ธฐ
- ์๋ก์ด ๊ธฐํ๋ค์ ์ฌ์ผํ๋๋ฐ, ์ด๋ค ๊ธฐํ๋ ํน์ ํ ๊ณก๋ค๋ง ์ ๋๋ก ์ฐ์ฃผํ ์ ์์
- ์ต๋ํ ๋ง์ ๊ณก์ ์ฐ์ฃผํ๋ ค๊ณ ํ ๋ ํ์ํ ๊ธฐํ์ ์ต์ ๊ฐ์ ๊ตฌํ๊ธฐ
์ ๋ ฅ
- ๊ธฐํ ๊ฐ์ N, ๊ณก์ ๊ฐ์ M (1 ≤ N ≤ 10, 1 ≤ M ≤ 50)
- ๋์งธ์ค ๋ถํฐ N๊ฐ์ ์ค์ (๊ธฐํ ์ด๋ฆ, ๊ธฐํ๊ฐ ์ฐ์ฃผํ ์ ์๋ ๊ณก ์ ๋ณด)๊ฐ 1๋ฒ ๊ณก๋ถํฐ ์ฐจ๋ก๋๋ก ์ฃผ์ด์ง
- Y๋ ์ฐ์ฃผํ ์ ์๋ ๊ฒ, N์ ์๋ ๊ฒ
- ๊ธฐํ ์ด๋ฆ์ ๋๋ฌธ์๋ก๋ง ์ด๋ฃจ์ด์ง (2 ≤ ๊ธฐํ ์ด๋ฆ ≤ 50, ์ค๋ณต ์์)
์ถ๋ ฅ
- ํ์ํ ๊ธฐํ์ ๊ฐ์ ์ถ๋ ฅ
- ์ฐ์ฃผํ ์ ์๋ ๊ณก์ด ์๋ค๋ฉด -1
ํ์ด ๋ฐฉ๋ฒ ์๊ฐํด๋ณด๊ธฐ
๊ฐ ๊ธฐํ๊ฐ ์ฐ์ฃผํ ์ ์๋ ๊ณก ์ ๋ณด์ ๋ํด Y๋ 1, N์ 0์ผ๋ก ๋ณํํ์ฌ ๋นํธ๋ง์คํน์ ์ฌ์ฉํ๋ ๊ฒ์ ์๊ฐํด๋ณผ ์ ์๋ค. ๊ธฐํ ๊ฐ์๊ฐ 10๊ฐ ์ดํ ์ด๋ฏ๋ก ์์ ํ์๋ ์ถฉ๋ถํ ๊ฐ๋ฅํ๋ค. ๋ฐฑํธ๋ํน์ ํตํด ๊ธฐํ๋ฅผ ๊ณ ๋ฅผ ์ ์๋ ๋ชจ๋ ๊ฒฝ์ฐ์ ์๋ฅผ ๊ตฌํ๊ณ , ํด๋น ๊ธฐํ๋ค์ด ์ฐ์ฃผํ ์ ์๋ ๊ณก ์ ๋ณด์ ๋ํด ๋นํธ OR( | ) ์ฐ์ฐ์ ํด์ ๊ฐ์ฅ ํฐ ๊ฐ์ด ๋์ค๋ ๊ฒฝ์ฐ๋ฅผ ๋ฐํํ๋ค. ์ด ๊ฒฝ์ฐ ์๊ฐ๋ณต์ก๋๋ ์ต์ ์ ๊ฒฝ์ฐ O(2¹โฐ)์ด ๋๋ค.
๐์ฝ๋ ์ค๊ณํ๊ธฐ
- max_count์ max_value๋ฅผ 0์ผ๋ก ์ด๊ธฐํํ๋ค.
- ๋ฐฑํธ๋ํน์ ์ํํ ํจ์ backtracking(current_value, current_idx, current_count)๋ฅผ ์ ์ํ๋ค.
- max_value์ current_value๋ฅผ ๋น๊ตํ๋ค.
- ๋์ ๊ฐ์ด ๊ฐ๊ณ max_count๋ณด๋ค current_count๊ฐ ๋ ์๋ค๋ฉด max_count๋ฅผ ํ์ฌ ๊ฐ์ผ๋ก ๊ฐฑ์ ํ๋ค.
- current_value๊ฐ ๋ ํฌ๋ค๋ฉด, max_value์ max_count๋ฅผ ํ์ฌ ๊ฐ์ผ๋ก ๊ฐฑ์ ํ๋ค.
- current_idx๊ฐ N๊ณผ ๊ฐ๋ค๋ฉด ํจ์๋ฅผ ์ข ๋ฃํ๋ค.
- backtracking(current_value | guitars[current_idx+1], current_idx+1, current_count+1)๋ฅผ ํธ์ถํ๋ค.
- backtracking(current_value, current_idx+1, current_count)๋ฅผ ํธ์ถํ๋ค.
- max_value์ current_value๋ฅผ ๋น๊ตํ๋ค.
- ๊ธฐํ์ ๊ฐ์ N๊ณผ ๊ณก์ ๊ฐ์ M์ ์ ๋ ฅ๋ฐ๋๋ค.
- ๋ฆฌ์คํธ guitars๋ฅผ ์์ฑํ๋ค.
- ๊ธฐํ๋ค์ ์ ๋ณด (name, vailable_songs)๋ฅผ ์ ๋ ฅ๋ฐ์, vailable_songs์ ๋ํด Y๋ฅผ 1, N์ 0์ผ๋ก ๋ฐ๊พธ๊ณ 10์ง์๋ก ๋ณํํ์ฌ guitars์ ์ ์ฅํ๋ค.
- backtracking(0, -1, 0)์ ํธ์ถํ๋ค.
- ๋ง์ฝ max_value๊ฐ 0์ด๋ผ๋ฉด -1์ ์ถ๋ ฅํ๊ณ , ์๋๋ผ๋ฉด max_count๋ฅผ ์ถ๋ ฅํ๋ค.
๐์ ๋ต ์ฝ๋
Python
import sys
input = sys.stdin.readline
max_value = max_count = 0
def backtracking(current_value, current_idx, current_count):
global max_value, max_count
if current_value == max_value:
max_count = min(max_count, current_count)
if current_value > max_value:
max_value, max_count = current_value, current_count
if current_idx == N:
return
backtracking(current_value | guitars[current_idx], current_idx+1, current_count+1)
backtracking(current_value, current_idx+1, current_count)
N, M = map(int, input().split())
guitars = [int(input().split()[1].replace('Y', '1').replace('N', '0'), 2) for _ in range(N)]
backtracking(0, 0, 0)
if max_value == 0:
print(-1)
else:
print(max_count)
Java
import java.io.*;
import java.util.*;
public class Main {
public static int maxValue = 0;
public static int maxCount = 0;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
int M = Integer.parseInt(st.nextToken());
int[] guitars = new int[N];
for (int i = 0; i < N; i++) {
st = new StringTokenizer(br.readLine());
st.nextToken();
String valiable_songs = st.nextToken().replace('Y', '1').replace('N', '0');
guitars[i] = Integer.parseInt(valiable_songs, 2);
}
backtracking(guitars, 0, 0, 0, N);
if (maxValue == 0) {
System.out.println(-1);
} else {
System.out.println(maxCount);
}
}
public static void backtracking(int[] guitars, int currentValue, int currentIdx, int currentCount, int N) {
if (currentValue == maxValue) {
maxCount = Math.min(currentCount, maxCount);
}
if (currentValue > maxValue) {
maxCount = currentCount;
maxValue = currentValue;
}
if (currentIdx == N) return;
backtracking(guitars, currentValue | guitars[currentIdx], currentIdx+1, currentCount+1, N);
backtracking(guitars, currentValue, currentIdx+1, currentCount, N);
}
}
- ๊ณก์ ๊ฐ์๊ฐ ์ต๋ 50๊ฐ๊ฐ ๋ ์ ์์ผ๋ฏ๋ก, ์ต๋ 50๋นํธ์ ์ ์๋ฅผ ์ ์ฅํด์ผ ํ๋ค. int๋ 32๋นํธ ์ ์ํ์ด๋ฏ๋ก 64๋นํธ ์ ์ํ์ธ long ์๋ฃํ์ ์ฌ์ฉํด์คฌ๋ค.
JavaScript
const fs = require('fs');
const input = fs.readFileSync("/dev/stdin").toString().trim().split("\n");
const [N, M] = input[0].split(" ").map(Number);;
const guitars = Array.from({length: N}, () => 0n);
for (let i = 0; i < N; i++) {
const valiableSongs = input[i+1].split(" ")[1].replaceAll('Y', '1').replaceAll('N', '0');
guitars[i] = BigInt('0b' + valiableSongs);
}
let maxValue = 0n;
let maxCount = 0;
const backtracking = (currentValue, currentIdx, currentCount) => {
if (currentValue === maxValue) {
maxCount = Math.min(maxCount, currentCount);
}
if (currentValue > maxValue) {
maxValue = currentValue;
maxCount = currentCount;
}
if (currentIdx === N) return;
backtracking(currentValue | guitars[currentIdx], currentIdx+1, currentCount+1);
backtracking(currentValue, currentIdx+1, currentCount);
}
backtracking(0n, 0, 0);
console.log((maxValue ? maxCount : -1))
728x90