개발조아

[BOJ/백준] 7490 0 만들기 파이썬 본문

알고리즘/백준

[BOJ/백준] 7490 0 만들기 파이썬

개발조아 2021. 8. 30. 16:58
728x90

문제 링크 : https://www.acmicpc.net/problem/7490

 

7490번: 0 만들기

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

www.acmicpc.net

 

백트래킹, 브루트포스 문제이다.

1~N까지 숫자들 사이에 연산자 '+','-',' ' 중 한가지를 반드시 넣고 결과를 계산해서 그 값이 0인 것의 식을 출력하는 것이다.

' '의 경우 두수를 붙이는 것이다.

 

연산자들을 모두 넣고 마지막에 계산해야한다.

중간중간에 계산한다면 더 복잡해질 것이다. 1-2 3 같은 경우가 힘들듯하다.

그래서 모든 자리에 다 연산자를 넣고 마지막에 값만 계산해서 확인하면 된다.

 

연산자 넣는 것은 간단한 백트래킹, 재귀로 구현이 가능하다.

 

모든 연산자를 넣은 값 후 계산의 경우 eval() 메서드를 이용하면 아주 쉽다.

그게 아니면 for문으로 검사해도 쉽게 할 수 있다.

 

eval()은 문자열로 된 식을 계산해주는 파이썬 내장함수이다.

eval('1+2'), eval('abs(-1)') 이런 문자열로 된 식을 계산해준다.

그렇기 때문에 백트래킹으로 다 정하고 마지막에 eval로 계산해주면 된다. 

 

값을 계산할때는 ' ' 문자를 ''으로 바꿔야 정확한 식이 되는 것이니 주의하자

 

마지막 출력할 때 아스키 코드 순으로 출력하라 했다.

숫자야 그 순서대로 아스키코드 순이지만 ' ','+','-'는 다르다

그래서 중간중간 결과값을 배열에 저장후 정렬해도 되지만 백트래킹 시 우선순위에 따라 넣고 출력해주면 된다.

연산자의 우선순위는 ' ','+' ,'-' 순이다. 이를 배열에 넣고 정렬해서 확인 가능하다.

tc = int(input())

def solv():
    global n,answer
    n = int(input())
    answer = []
    select_operator(2,'1')
    print()
def select_operator(now,ans):
    global answer
    if now == n+1:
        calc(ans)
        return

    select_operator(now+1,ans+' '+str(now))
    select_operator(now+1,ans+'+'+str(now))
    select_operator(now+1,ans+'-'+str(now))

def calc(ans):
    tmp = ans.replace(' ','')
    if eval(tmp) == 0:
        print(ans)
for _ in range(tc):
    solv()

 

Comments