• 문제 링크
11277번: 2-SAT - 1
첫째 줄에 변수의 개수 N (1 ≤ N ≤ 20)과 절의 개수 M (1 ≤ M ≤ 100)이 주어진다. 둘째 줄부터 M개의 줄에는 절이 주어진다. 절은 두 정수 i와 j (1 ≤ |i|, |j| ≤ N)로 이루어져 있으며, i와 j가 양수인
www.acmicpc.net
• 풀이 과정
• 풀이 코드
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;
public class Main {
static int n, m;
static boolean[] comb;
static Pair[] pairs;
static BufferedWriter bw;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st = new StringTokenizer(br.readLine());
n = Integer.parseInt(st.nextToken());
m = Integer.parseInt(st.nextToken());
comb = new boolean[n + 1];
pairs = new Pair[m + 1];
for (int i = 1; i <= m; i++) {
st = new StringTokenizer(br.readLine());
pairs[i] = new Pair(Integer.parseInt(st.nextToken()), Integer.parseInt(st.nextToken()));
}
recur(0);
bw.write("0");
bw.flush();
}
private static void recur(int depth) throws IOException {
if (depth == n + 1) {
boolean flag = true;
for (int i = 1; i <= m; i++) {
boolean left = pairs[i].left < 0 ? !comb[-pairs[i].left] : comb[pairs[i].left];
boolean right = pairs[i].right < 0 ? !comb[-pairs[i].right] : comb[pairs[i].right];
flag = flag && (left || right);
}
if (flag)
bw.write("1");
else
return;
bw.flush();
System.exit(0);
}
for (int i = 0; i < 2; i++) {
comb[depth] = i == 0 ? true : false;
recur(depth + 1);
}
}
private static class Pair {
int left, right;
public Pair(int left, int right) {
this.left = left;
this.right = right;
}
}
}
'Problem Solving > Baekjoon' 카테고리의 다른 글
[백준] 21735 눈덩이 굴리기 - Backtracking / Java (0) | 2023.02.26 |
---|---|
[백준] 9742 순열 - Backtracking / Java (0) | 2023.02.25 |
[백준] 10597 순열장난 - Backtracking / Java (0) | 2023.02.23 |
[백준] 2992 크면서 작은 수 - Backtracking / Java (0) | 2023.02.22 |
[백준] 10974 모든 순열 - Backtracking / Java (0) | 2023.02.21 |
댓글