[BOJ] 7490 - 0 만들기 (with. eval()
🌟)
사용 언어: Python3
문제
풀이
나의 풀이
def process():
# ✅ 기호(res)과 숫자(lst)를 이용해 주어진 규칙대로 수식을 계산하는 함수
def calcAns(res): # res는 +, -, 공백 모임
expression = [] # ✅ 계산하기 위해 공백을 제거하고 숫자를 이어붙인 수식
tmp = '' # ✅ tmp는 숫자 묶음 (공백일 경우 tmp 뒤에 이어붙인다)
for i in range(len(res)):
tmp += str(lst[i]) # ✅ 공백이면 tmp에 이어붙인다
if res[i] != ' ':
expression.append(int(tmp)) # 숫자
expression.append(res[i]) # 기호
tmp = '' # 초기화
expression.append(lst[-1] if tmp == '' else int(tmp+str(lst[-1]))) # ✅ 바로 위 for문은 기호로 끝나기 때문에 맨 마지막 수까지 추가
# ✅ 완성된 수식 계산
ans = expression[0]
for i in range(1, len(expression), 2): # ✅ 기호들로 점프
if expression[i] == '+':
ans += expression[i+1]
elif expression[i] == '-':
ans -= expression[i+1]
# ✅ 수식 계산 결과가 0이면 그때의 res를 이용해 공백이 포함된 expression_with_blank를 만든 후 answer_expressions에 추가
if ans == 0:
expression_with_blank = ''
for i in range(len(res)):
expression_with_blank += str(lst[i]) + res[i]
expression_with_blank += str(lst[-1])
answer_expressions.append(expression_with_blank)
# ✅ 기호들로 이루어진 리스트 만들기
def DFS(L):
if L == N - 1:
calcAns(res) # ✅ 만들어진 기호 식을 이용해 수식 계산
return
for x in '+- ':
res[L] = x
DFS(L+1)
N = int(input())
lst = [x for x in range(1, N+1)]
res = [''] * (N - 1) # (+, -, 공백)으로 이루어진 리스트
answer_expressions = [] # ✅ 답이 될 수식 (공백 포함)
DFS(0)
for row in sorted(answer_expressions): # ✅ 정렬 후 출력
print(row)
TC = int(input())
for _ in range(TC):
process()
print()
- 테스트 케이스: 통과
- 제출 결과: 통과
나의 풀이
def process():
# ✅ 기호(res)과 숫자(lst)를 이용해 주어진 규칙대로 수식을 계산하는 함수
def calcAns(res): # res는 +, -, 공백 모임
ans = '' # 기호와 숫자를 합한 수식 (공백 포함)
for i in range(len(res)):
ans += str(lst[i]) + res[i]
ans += str(lst[-1])
# 맨 처음 수로 tot 초기화
tot = '' # 나중에 int로 변환
for x in ans:
if x.isdecimal():
tot += x
elif x == ' ':
pass
else: # 기호가 나오면 스택 비우기
break # for문 break
tot = int(tot) # 이제 tot은 맨 처음 수
new_ans = ans[len(str(tot)):] # 맨 처음 수(tot) 제외하고 슬라이싱
op = '' # 기호 담아놓을 곳
digit = '' # 숫자 담아놓을 곳
for x in new_ans:
# 다음 기호가 나올 때 이전 기호와 숫자(digit) 처리
if x.isdecimal():
digit += x
elif x == '+' or x == '-':
if len(op) == 0: # len(op) == 0 은 x가 new_ans의 맨 처음 기호일 때만 해당된다
pass
elif op == '+': # 다음 기호를 만났을 때 이전 기호(op)와 숫자(digit) 처리하고 op에 나 넣기
tot += int(digit)
elif op == '-':
tot -= int(digit)
digit = '' # digit 초기화
op = x # op에 나 넣기
# 맨 마지막 기호와 숫자 처리
if op == '+':
tot += int(digit)
elif op == '-':
tot -= int(digit)
# 수식 계산 결과가 0 이면 answer_expressions에 추가 (나중에 sort 하기 위해)
if tot == 0:
answer_expressions.append(ans)
# ✅ 기호들로 이루어진 리스트 만들기
def DFS(L):
if L == N - 1:
calcAns(res) # ✅ 만들어진 기호 식을 이용해 수식 계산
return
for x in '+- ':
res[L] = x
DFS(L+1)
N = int(input())
lst = [x for x in range(1, N+1)]
res = [''] * (N - 1) # (+, -, 공백)으로 이루어진 리스트
answer_expressions = [] # ✅ 답이 될 수식 (공백 포함)
DFS(0)
for row in sorted(answer_expressions): # ✅ 정렬 후 출력
print(row)
TC = int(input())
for _ in range(TC):
process()
print()
- 테스트 케이스: 통과
- 제출 결과: 통과
나의 풀이 (개선) 🌟🌟🌟
def process():
# ✅ 기호(res)과 숫자(lst)를 이용해 주어진 규칙대로 수식을 계산하는 함수
def calcAns(res): # res는 (+, -, 공백) 모임
statement = '' # 공백을 포함한 수식
for i in range(len(res)):
statement += str(lst[i]) + res[i]
statement += str(lst[-1])
if (eval(statement.replace(' ', ''))) == 0: # ✅ eval 이라는 함수는 문자열로 작성된 코드 내용을 그대로 실행시켜준다
answer_expressions.append(statement)
# ✅ 기호들로 이루어진 리스트 만들기
def DFS(L):
if L == N - 1:
calcAns(res) # ✅ 만들어진 기호 식을 이용해 수식 계산
return
for x in '+- ':
res[L] = x
DFS(L+1)
N = int(input())
lst = [x for x in range(1, N+1)]
res = [''] * (N - 1) # (+, -, 공백)으로 이루어진 리스트
answer_expressions = [] # ✅ 답이 될 수식 (공백 포함)
DFS(0)
for row in sorted(answer_expressions): # ✅ 정렬 후 출력
print(row)
TC = int(input())
for _ in range(TC):
process()
print()
- 테스트 케이스: 통과
- 제출 결과: 통과
eval()
이라는 함수를 사용하니 풀이가 정말정말 간단해졌다..
💛 개인 공부 기록용 블로그입니다. 👻