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
'자료구조 & 알고리즘 & cs > CodingTest' 카테고리의 다른 글
[python] 2469 - 사다리 타기 (2) | 2023.06.18 |
---|---|
[python] 2608 - 로마 숫자 (0) | 2023.06.15 |
[python] 프로그래머스 Lv2. - [2018 KAKAO] 압축 (0) | 2023.06.15 |
[python] 12904- A와 B (0) | 2023.06.13 |
[python] 11559 - Puyo Puyo (0) | 2023.06.09 |