https://www.acmicpc.net/problem/14492
14492번: 부울행렬의 부울곱
문제를 출제하던 욱제는 갑자기 괴랄한 문제를 내고 싶어졌다. 불행하게도, 이번 대회에는 프로그래밍 뉴비들이 많기 때문에 그럴 수는 없었다. 하지만 욱제는 신입생들을 괴롭히고픈 욕망을
www.acmicpc.net
난이도 : S5
구현 : 2차원행렬
시간복잡도 : N^3
문제 풀이
- 부울곱
- 행렬곱
부울곱 개념과 행렬곱 개념만 알면 쉽게 해결되는 문제입니다.
A행렬
1 | 1 | 0 |
0 | 1 | 0 |
0 | 0 | 1 |
B행렬
1 | 0 | 0 |
1 | 1 | 1 |
0 | 0 | 1 |
부울곱 계산 예시)
정답 행렬의 (0,0)의 칸의 값 구하기 -> (1 && 1) | | (1 && 1) || (0 && 1) -> 1
1이 한 번이라도 나오면 1이 된다.
코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
private int N;
private boolean[][] A, B;
private int res;
public void solution() throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
N = Integer.parseInt(br.readLine());
A = new boolean[N][N];
for (int i = 0; i < N; i++) {
st = new StringTokenizer(br.readLine());
for (int j = 0; j < N; j++) {
if (Integer.parseInt(st.nextToken()) == 1) {
A[i][j] = true;
}
}
}
B = new boolean[N][N];
for (int i = 0; i < N; i++) {
st = new StringTokenizer(br.readLine());
for (int j = 0; j < N; j++) {
if (Integer.parseInt(st.nextToken()) == 1) {
B[i][j] = true;
}
}
}
boolean flag;
res = 0;
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
flag = false;
for (int k = 0; k < N; k++) {
flag |= A[i][k] & B[k][j];
if (flag) {
res++;
break;
}
}
}
}
System.out.println(res);
}
public static void main(String[] args) throws IOException {
new Main().solution();
}
}
'Algorithm, Problem Solving > 백준(boj)' 카테고리의 다른 글
[백준][Java] 2565 - 전깃줄 (0) | 2023.03.23 |
---|---|
[백준][Java] 24228 - 젓가락 (0) | 2023.03.23 |
[백준][java] 25644 - 최대 상승 (0) | 2023.03.22 |
[백준][java] 10431 - 줄세우기 (0) | 2023.03.22 |
[백준][java] 9733 - 꿀벌 (0) | 2023.03.21 |
댓글