
BOJ 1009 분산처리
2023-05-25
1 min
총 100,000 비트로 이루어진 이진수 A와 B가 주어진다.
이때, A & B, A | B, A ^ B, ~A, ~B를 한 값을 출력하는 프로그램을 작성하시오.
첫째 줄에 이진수 A, 둘째 줄에 이진수 B가 주어진다.
두 이진수의 길이는 모두 100,000이다.
예제의 경우에만 길이가 10이며, 예제는 채점하지 않는다.
해당 문제는 단순 구현 문제로 비트 단위 연산을 구현하면 쉽게 해결 할 수 있다.
각 연산은 아래와 같은 진리표를 참고하여 구현하면 된다.
| A | B | A & B |
|---|---|---|
| 0 | 0 | 0 |
| 0 | 1 | 0 |
| 1 | 0 | 0 |
| 1 | 1 | 1 |
AND(&)연산의 경우에는 두 비트의 합이 2일 경우에만 1을 반환한다.
| A | B | A | B |
|---|---|---|
| 0 | 0 | 0 |
| 0 | 1 | 1 |
| 1 | 0 | 1 |
| 1 | 1 | 1 |
OR(|)연산의 경우에는 두 비트의 합이 1 이상일 경우에 1을 반환한다.
| A | B | A ^ B |
|---|---|---|
| 0 | 0 | 0 |
| 0 | 1 | 1 |
| 1 | 0 | 1 |
| 1 | 1 | 0 |
XOR(^)연산의 경우에는 두 비트의 합이 1일 경우에만 1을 반환한다.
| A | ~A |
|---|---|
| 0 | 1 |
| 1 | 0 |
NOT(~)연산의 경우에는 비트의 값이 0인 경우에 1을 반환한다.
위의 연산별 규칙들을 구현하면 문제를 해결 할 수 있다.
import java.io.*;
public class Main {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// 두개의 이진수 입력
String s1 = new StringBuilder(br.readLine()).reverse().toString();
String s2 = new StringBuilder(br.readLine()).reverse().toString();
// 계산 결과 저장하기 위한 배열
StringBuilder[] sb = new StringBuilder[5];
for(int i = 0; i < sb.length; i++) sb[i] = new StringBuilder();
for(int i = 0; i < 100000; i++) {
int c1 = s1.charAt(i) - '0';
int c2 = s2.charAt(i) - '0';
// AND 연산
if(c1 + c2 == 2) sb[0].append('1');
else sb[0].append('0');
// OR 연산
if(c1 + c2 >= 1) sb[1].append('1');
else sb[1].append('0');
// XOR 연산
if(c1 != c2) sb[2].append('1');
else sb[2].append('0');
// NOT 연산
if(c1 == 0) sb[3].append('1');
else sb[3].append('0');
// NOT 연산
if(c2 == 0) sb[4].append('1');
else sb[4].append('0');
}
for(StringBuilder out : sb) {
System.out.println(out.reverse());
}
}
}
#include <iostream>
#include <algorithm>
#define fastio ios_base::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr)
#define endl '\n'
using namespace std;
int main() {
fastio;
// 두개의 이진수 입력
string s1, s2;
cin >> s1 >> s2;
reverse(s1.begin(), s1.end());
reverse(s2.begin(), s2.end());
// 계산 결과 저장하기 위한 배열
string sb[5];
for(int i = 0; i < 100000; i++) {
int c1 = s1[i] - '0';
int c2 = s2[i] - '0';
// AND 연산
if(c1 + c2 == 2) sb[0] += '1';
else sb[0] += '0';
// OR 연산
if(c1 + c2 >= 1) sb[1] += '1';
else sb[1] += '0';
// XOR 연산
if(c1 != c2) sb[2] += '1';
else sb[2] += '0';
// NOT 연산
if(c1 == 0) sb[3] += '1';
else sb[3] += '0';
// NOT 연산
if(c2 == 0) sb[4] += '1';
else sb[4] += '0';
}
for(string out : sb) {
reverse(out.begin(), out.end());
cout << out << endl;
}
return 0;
}
fun main(args: Array<String>) = with(System.`in`.bufferedReader()) {
// 두개의 이진수 입력
var s1 = readLine().reversed()
var s2 = readLine().reversed()
// 계산 결과 저장하기 위한 배열
var sb = Array<StringBuilder?>(5){null}
for(i in 0 until 5) {
sb[i] = StringBuilder()
}
for(i in 0 until 100000) {
var c1 = s1[i] - '0'
var c2 = s2[i] - '0'
// AND 연산
if(c1 + c2 == 2) sb[0]!!.append("1")
else sb[0]!!.append("0")
// OR 연산
if(c1 + c2 >= 1) sb[1]!!.append("1")
else sb[1]!!.append("0")
// XOR 연산
if(c1 != c2) sb[2]!!.append("1")
else sb[2] = sb[2]!!.append("0")
// NOT 연산
if(c1 == 0) sb[3]!!.append("1")
else sb[3]!!.append("0")
// NOT 연산
if(c2 == 0) sb[4]!!.append("1")
else sb[4]!!.append("0")
}
for(out in sb) {
println(out!!.reversed())
}
}
from sys import stdin
def main():
# 두개의 이진수 입력
s1 = stdin.readline()
s2 = stdin.readline()
# Null 문자 제거
s1 = s1[::-1].strip()
s2 = s2[::-1].strip()
# 계산 결과 저장하기 위한 배열
sb = [""] * 5
for i in range(100000):
c1 = ord(s1[i]) - ord('0')
c2 = ord(s2[i]) - ord('0')
# AND 연산
if c1 + c2 == 2:
sb[0] = sb[0] + "1"
else:
sb[0] = sb[0] + "0"
# OR 연산
if c1 + c2 >= 1:
sb[1] = sb[1] + "1"
else:
sb[1] = sb[1] + "0"
# XOR 연산
if c1 != c2:
sb[2] = sb[2] + "1"
else:
sb[2] = sb[2] + "0"
# NOT 연산
if c1 == 0:
sb[3] = sb[3] + "1"
else:
sb[3] = sb[3] + "0"
# NOT 연산
if c2 == 0:
sb[4] = sb[4] + "1"
else:
sb[4] = sb[4] + "0"
for out in sb:
print(out[::-1])
if __name__ == "__main__":
main()
import Foundation
func main() {
// 두개의 이진수 입력
var s1 = String(readLine()!.reversed())
var s2 = String(readLine()!.reversed())
// 계산 결과 저장하기 위한 배열
var sb = [String](repeating: "", count: 5)
for i in 0..<100000 {
var c1 = Int(String(s1[String.Index(encodedOffset: i)]))!
var c2 = Int(String(s2[String.Index(encodedOffset: i)]))!
// AND 연산
if(c1 + c2 == 2) {
sb[0].append("1")
} else {
sb[0].append("0")
}
// OR 연산
if(c1 + c2 >= 1) {
sb[1].append("1")
} else {
sb[1].append("0")
}
// XOR 연산
if(c1 != c2) {
sb[2].append("1")
} else {
sb[2].append("0")
}
// NOT 연산
if(c1 == 0) {
sb[3].append("1")
} else {
sb[3].append("0")
}
// NOT 연산
if(c2 == 0) {
sb[4].append("1")
} else {
sb[4].append("0")
}
}
for out in sb {
print(String(out.reversed()))
}
}
main()
