본문 바로가기

자료구조 & 알고리즘 & cs/CodingTest

[python] 7490 - 0 만들기

7490번: 0 만들기 (acmicpc.net)

 

7490번: 0 만들기

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

www.acmicpc.net

 

 

# 7490 0 만들기
from itertools import product
import sys

input = sys.stdin.readline

#아스키 코드 값으로 정렬 하려먼 공백-> + -> -
sign=[' ', '+', '-']

for _ in range(int(input())):
    
    # 오름차순 리스트
    numList = [ i for i in range(1, int(input())+1)]

    # 부호에 대한 중복 순열 리스트, 각 케이스 별로 0이 되는지를 체크
    for s in product(sign, repeat=len(numList)-1):
        total=''
        s = list(s)
        
        # 숫자와 문자가 합쳐진 전체 문자열 total 생성
        for i in range(len(s)):
            total+=str(numList[i])
            total+=s[i]
        total+=str(numList[-1])
        
        # 공백 없앨 때 replace
        # eval 함수? -> 정리해놓기(eval/exec/compile)
        if eval(total.replace(' ', '')) == 0:
            print(total)
        
    print()

 

부호들과 오름차순 숫자 리스트들을 섞어서 써야하기 때문에

가장 먼저 생각난 것은 중복 순열이었다.

파이썬에서는 itertools 모듈로 중복순열을 확인할 수 있으므로 이를 사용하여 코드를 짰다.

 

그런데 예상치 못한 두가지 이슈가 있었다.

 

1. 아스키 코드값으로 정렬한 후 출력해야 하는데 어떻게 해야 하는가?

2. 식은 문자열인데 결과값이 0인 것을 확인하려면 어떻게 해야 하는가?

 

결국 코드를 완성하지 못하고 구글링을 했고

답을 찾을 수 있게 되었다.

 

1번 이슈는 부호가 들어있는 sign 리스트의 순서만 바꿔주면 되었다.

공백, +, - 순으로 아스키 코드값이 정렬되어있으므로 순서를 다시 바꿔주었다.

 

2번 이슈는 eval() 함수를 사용하였다.

파이썬에서는 문자열을 코드로 실행하는 함수(eval, exec)를 지원한다.

 

두 가지 이슈 사항을 해결하고 나니 답을 맞힐 수 있었다.

 

 

 

* 모든 코드는 github에서 관리합니다.  seinShin (SEIN SHIN) (github.com)

 

seinShin - Overview

blog : https://bboddorong.tistory.com/. seinShin has 7 repositories available. Follow their code on GitHub.

github.com

728x90