- 문제 : https://www.acmicpc.net/problem/7490
문제 이해
- 1부터 n까지의 수를 오름차순으로 정렬한 뒤 그 사이에 '+', '-', ' '(공백)의 연산을 넣은 뒤 연산의 결과가 0인 수식들을 출력하는 문제다.
- 브루트포스 알고리즘으로 주어진 1 - n 숫자 사이에 계속 연산들을 넣고, 그 중 결과로 식별하면 된다고 이해까지는 했는데, 구체적으로 어떻게 구현해야할지 몰랐다.
- 풀이를 찾아보니 일단 연산을 추가하는 거는 재귀함수로 돌리면 되고, 그렇게 구한 연산들을 숫자와 나란히 붙인뒤 값을 식별해 출력하면 된다.
- 재귀함수 돌리고 목표 연산 개수인 k개에 도달하면, operator_list에 array를 deepcopy해서 추가해줘야 한다. (꼭 deepcopy를 해 야한다)
- 연산 추가하는 순서도 중요하다 아스키 코드가 작은 ' ' (아스키 코드 34), '+' (아스키 코드 44), '-' (아스키 코드 45) 순서로 해야 틀리지 않는다.
- 이때 만든 수식의 결과 값이 0인지 확인해야하는데, 문자열이므로 eval() 함수를 이용해 문자열을 계산해 결과가 0임을 확인하면된다. 여기에서 중요한 게 ' '(공백)은 count 되면 안되므로 ' '를 ''로 대체해서 eval을 진행하면 된다.
근데 아직도 문제가 잘 이해 안 가는게 수식의 합이 0이어야 하는데, 아래 수식 같은 경우는 어떻게 결과가 0이 되는지 모르겠다,,,
1-2 3-4 5+6 7
그래서 pythontutor로 결과를 돌려봤는데 1-2(공백)3 인 경우에는 1-23으로 계산이 된다.
정답 풀이
import copy
def recursive(array, k):
if len(array) == k:
operator_list.append(copy.deepcopy(array))
return
array.append(' ')
recursive(array, k)
array.pop()
array.append('+')
recursive(array, k)
array.pop()
array.append('-')
recursive(array, k)
array.pop()
t = int(input())
for _ in range(t):
n = int(input())
operator_list = []
recursive([], n - 1)
integer = [i for i in range(1, n + 1)]
for operator in operator_list:
string = ''
for i in range(n - 1):
string += str(integer[i]) + operator[i]
string += str(integer[-1])
if eval(string.replace(' ', '')) == 0:
print(string)
print()
'백준 > 구현' 카테고리의 다른 글
[구현/백준] 15662번: 톱니바퀴(2) (0) | 2023.10.02 |
---|---|
[구현/백준] 15686번 : 치킨 배달 (2) | 2023.10.02 |
[구현/백준] 14719번 : 빗물 (0) | 2023.09.13 |
[구현/백준] 20055번 : 컨베이어 벨트 (0) | 2023.09.12 |
[구현/백준] 14503번 : 로봇 청소기 (0) | 2023.09.11 |