728x90
https://www.acmicpc.net/problem/7490
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 |