3 분 소요

사용 언어: Python3

문제

0 만들기

풀이

나의 풀이

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()
  • 테스트 케이스: 통과
  • 제출 결과: 통과
    스크린샷 2023-06-23 오후 3 07 52

IMG_0475

나의 풀이

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()
  • 테스트 케이스: 통과
  • 제출 결과: 통과
    스크린샷 2023-06-22 오후 3 24 17

IMG_0477

나의 풀이 (개선) 🌟🌟🌟

참고

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()
  • 테스트 케이스: 통과
  • 제출 결과: 통과
    스크린샷 2023-06-23 오후 4 29 40
  • eval()이라는 함수를 사용하니 풀이가 정말정말 간단해졌다..


💛 개인 공부 기록용 블로그입니다. 👻

맨 위로 이동하기