본문 바로가기
기술/Problem Solving

[baekjoon] 4900번 7 더하기

by 팡팡구리 2021. 7. 27.
반응형

출처


https://www.acmicpc.net/problem/4900

 

4900번: 7 더하기

입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 테스트 케이스는 A+B=꼴이며, A와 B는 두 수 a와 b를 7 세그먼트 디스플레이 상에서의 코드로 표현한 값이다. (0 < a,b < a+b < 1,000,000,000) 마지막

www.acmicpc.net

 

 

문제


 

7 세그먼트 디스플레이는 위 그림과 같이 일곱개의 LED로 이루어져 있다.

각각의 LED는 켜있거나 꺼져있을 수 있고, 독립적으로 작동한다.

이러한 LED의 조합은 총 127가지가 있으며, 주로 숫자 0부터 9까지를 표현하는데 사용된다. 

프로그래머는 이 디스플레이에 7비트 숫자를 전송해서 조정할 수 있다.

예를 들어, 1을 표시하려면 1번과 3번 LED만 켜야한다. 따라서, 0001010을 전송하면 된다.

이 7비트 숫자를 코드라고 하며, 보통 10진수로 표현한다. 

 

LED의 조합은 총 127가지가 있기 때문에, 코드는 3자리 숫자로 나타낼 수 있다.

예를 들어, 1은 0001010을 전송하면 되고 이 수의 10진수 값은 10이기 때문에, 코드로는 010으로 나타낸다.

한 자리 이상의 수를 나타낼 때는 코드를 이어서 사용하면 된다.

예를 들어, 13은 010079로 나타내면 되고, 144는 010106106으로 나타내면 된다.

 

7 세그먼트 디스플레이 상에서 코드로 나타낸 두 수가 주어졌을 때,

수의 합을 7 세그먼트 디스플레이에서 코드로 출력하는 프로그램을 작성하시오.

 

 

입력


입력은 여러 개의 테스트 케이스로 이루어져 있다.

각 테스트 케이스는 A+B=꼴이며, A와 B는 두 수 a와 b를 7 세그먼트 디스플레이 상에서 코드로 표현한 값이다.

(0 < a,b < a+b < 1,000,000,000) 마지막 줄에는 BYE가 주어진다.

 

 

출력


각 테스트 케이스에 대해서, 한 줄에 하나씩 A+B=C를 출력한다.

A와 B는 입력에서 주어진 값이며, C는 a+b를 다시 7 세그먼트 디스플레이 코드로 나타낸 값이다.

 

 

풀이 및 코드


문제에서 1을 표시하려면 0001010을 쓴다는 것을 보자마자 2진수라는 생각을 할 수 있었다.

실제로 0001010은 2^3 + 2^1 = 10 으로 문제에서 정의하는 1의 숫자 코드 10과도 일치했다.

 

숫자는 자릿수!

그러므로 0~9까지 LED 디스플레이에서 표현되는 2진수를 구한 후,

10진수를 계산했고 3자리 숫자표현으로 만들어 딕셔너리로 선언했다. 

ex) 숫자 3의 표현 : 1001111
     코드 : 2^6 + 2^3 + 2^2 + 2^1 + 2^0 = 79
     3자리 숫자표현 : 079

 

이 때, 변환 작업 편의를 위해 딕셔너리는 코드-숫자, 숫자-코드 2가지 형태로 선언했다.

 

# 코드를 숫자를 변환하는 함수
def to_num(x:str) -> str:
    num = ''
    key = ''
    for idx, i in enumerate(x):
        key += i
        if idx % 3 == 2:
            num += code_dict[key]
            key = ''
    return num

# 숫자를 코드로 변환하는 함수
def to_code(x:str) -> str:
    code = ''
    for key in x:
        code += num_dict[key]
    return code

# 코드-숫자 딕셔너리
code_dict = {'063': '0', '010': '1', '093': '2',
             '079': '3', '106': '4', '103': '5',
             '119': '6', '011': '7', '127': '8', '107': '9'}
# 숫자-코드 딕셔너리
num_dict = dict(map(reversed, code_dict.items()))

while True:
    formula = input()
    if formula == 'BYE': break
    a = formula.split('+')[0]
    # b는 끝에 '='를 슬라이싱해준다.
    b = formula.split('+')[-1][:-1]

    c_num = int(to_num(a)) + int(to_num(b))
    c = to_code(str(c_num))
    print(f'{a}+{b}={c}')

'기술 > Problem Solving' 카테고리의 다른 글

[Programmers] 주차 요금 계산  (0) 2022.01.17
[Programmers] 신고 결과 받기  (0) 2022.01.16
[baekjoon] 1263번 시간 관리  (0) 2021.07.23
[baekjoon] 1706번 크로스워드  (0) 2021.07.17
[baekjoon] 1051번 숫자 정사각형  (0) 2021.07.16