본문 바로가기

알고리즘/백준 문제 풀이

[Python] 7490번 0 만들기

728x90

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

 

7490번: 0 만들기

각 테스트 케이스에 대해 ASCII 순서에 따라 결과가 0이 되는 모든 수식을 출력한다. 각 테스트 케이스의 결과는 한 줄을 띄워 구분한다.

www.acmicpc.net


 

22/11/23

 

 

파이썬에 특화된 문제로, 만약 다른 언어로 이 문제를 풀었다면 힘들게 풀었을 것이다.


 

문제 접근 방식:

 

 

기껏 해봤자 입력으로 받는 자연수의 범위가 $9$까지 이기 때문에 그냥 깡으로 구현하면 될 것이라고 생각했다.

 

$N$개의 자연수가 있다면 그 사이에 공백이든, 더하기 기호든, 빼기 기호든지 간에 $N-1$개의 기호가 들어가므로 가능한 모든 조합들을 itertools모듈의 product함수를 사용하여 구현하였다.

 

만약 product함수를 사용하지 않는다면, 이 부분을 백트래킹으로 구현해야되기 때문에 조금 까다롭다.

 

$1$부터 $N$까지의 숫자가 차례대로 있는 문자열 $K$를 만들어주었다.

 

이후, product함수로 생성된 기호 튜플과 번갈아 가며 더해주며 새로운 계산식 $new \ expression$을 생성해 주었다.

 

이후, $new \ expression$에 공백을 제거하고, 그 계산식에 eval함수를 적용한 값이 $0$이 된다면 이를 print 해주는 방식으로 구현하였다.

 

ascii순서로 출력하는 것은 product함수에 ascii순으로 나열된 기호 리스트를 넣음으로써 해결하였다.

 

만약 파이썬이 아닌 언어라면 이 문제를 힘들게 해결했을 것이다. 


아래는 내가 위의 접근 방식과 같이 작성한 파이썬 코드이다. 더보기를 누르면 확인할 수 있다.

더보기
# 7490번 0 만들기
# 브루트 포스
'''
접근 방법:
기껏해봤자 자연수 범위가 9까지이고, 그냥 해도 된다.
'''
from itertools import product

T = int(input())
op = [' ', '+', '-']
for _ in range(T):
    N = int(input())
    k = ''.join(map(str, range(1, N+1)))
    for op_tpl in product(op, repeat=N-1):
        new_expression = k[0]
        for i in range(N-1):
            new_expression += op_tpl[i]
            new_expression += k[i+1]
        if eval(new_expression.replace(' ', '')) == 0:
            print(new_expression)
    print()

'알고리즘 > 백준 문제 풀이' 카테고리의 다른 글

[Python] 17394번 핑거 스냅  (0) 2022.11.29
[Python] 23747번 와드  (0) 2022.11.29
[Python] 4179번 불!  (0) 2022.11.29
[Python] 5427번 불  (0) 2022.11.29
[Python] 11729번 하노이 탑 이동 순서  (0) 2022.11.29