-- 예전 기록/BOJ

[ BOJ ] 12813 : 이진수 연산 ( BRONZE 2 ) / C, Python

rejo 2023. 11. 21. 10:50

문제

총 100,000 비트로 이루어진 이진수 A와 B가 주어진다. 이때, A & B, A | B, A ^ B, ~A, ~B를 한 값을 출력하는 프로그램을 작성하시오.

입력

첫째 줄에 이진수 A, 둘째 줄에 이진수 B가 주어진다. 두 이진수의 길이는 모두 100,000이다. 예제의 경우에만 길이가 10이며, 예제는 채점하지 않는다.

출력

첫째 줄부터 한 줄에 하나씩 차례대로 A & B, A | B, A ^ B, ~A, ~B를 출력한다.

풀이 과정

100,000 비트로 이루어진 이진수는 저장하기도 힘드므로, 문자열에 저장해서 하나하나씩 비트 연산하는 것처럼 출력한다.

C

#include <stdio.h>
#include <string.h>

char a[100005];
char b[100005];
int main(void) {
    scanf("%s", a);
    scanf("%s", b);
    int size = strlen(a);

    // A & B
    for (int i = 0; i < size; i++) {
        if (a[i] == '1' && b[i] == '1') printf("1");
        else printf("0");
    }
    printf("\n");

    // A | B
    for (int i = 0; i < size; i++) {
        if (a[i] == '0' && b[i] == '0') printf("0");
        else printf("1");
    }
    printf("\n");

    // A ^ B
    for (int i = 0; i < size; i++) {
        if (a[i] != b[i]) printf("1");
        else printf("0");
    }
    printf("\n");

    // ~A
    for (int i = 0; i < size; i++) {
        if (a[i] == '0') printf("1");
        else printf("0");
    }
    printf("\n");

    // ~B
    for (int i = 0; i < size; i++) {
        if (b[i] == '0') printf("1");
        else printf("0");
    }
    
    return 0;
}

Python

import sys
input = sys.stdin.readline

a = input().rstrip()
b = input().rstrip()

# A & B
for i in range(len(a)):
    if a[i] == b[i] == '1': print('1', end='')
    else: print('0', end='')
print()

# A | B
for i in range(len(a)):
    if a[i] == '1' or b[i] == '1': print('1', end='')
    else: print('0', end='')
print()

# A ^ B
for i in range(len(a)):
    if a[i] != b[i]: print('1', end='')
    else: print('0', end='')
print()

# ~A
for i in a:
    if i == '0': print('1', end='')
    else: print('0', end='')
print()

# ~B
for i in b:
    if i == '0': print('1', end='')
    else: print('0', end='')
print()