김호쭈
DevForYou
김호쭈
전체 방문자
오늘
어제
  • 분류 전체보기 (321)
    • • 데이터베이스(DB) (9)
      • __SQL__ (9)
    • •알고리즘(Algorithm ) (117)
      • 문제풀이 (99)
      • 스터디 (14)
      • 알고리즘 팁 (4)
    • •Compter Science (57)
      • Operating System (25)
      • Computer Network (1)
      • Computer Vision (16)
      • Artificial Intelligence (14)
      • Software Technology (1)
    • • 독서 (36)
      • Design Pattern (24)
      • 객체지향의 사실과 오해 (1)
      • Object Oriented Software En.. (11)
    • • 개발 (26)
      • React (3)
      • node.js (6)
      • Django (11)
      • Spring boot (6)
    • • 개발Tip (4)
      • GitHub (0)
    • •프로젝트 (2)
      • 물물 (2)
    • •App (54)
      • 안드로이드 with Kotlin (50)
      • 코틀린(Kotiln) (4)
    • •회고 (8)
    • •취준일기 (3)
    • • 기타 (2)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 깃허브데스크탑
  • local저장소
  • Remote저장소
  • 원격저장소
  • GitHubDesktop
  • 로컬저장소
  • ㄱ
  • KMU_WINK

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
김호쭈

DevForYou

[백준-7490] 0만들기 파이썬
•알고리즘(Algorithm )/문제풀이

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

2022. 8. 8. 03:20

# 문제

# 풀이

다음과 같이 1 다음에 공백,'+','-'가 오고 2 다음에도 똑같이 반복할 수 있다. 재귀적으로 하나씩 스택이 쌓이면서 해결해 나가는 방법을 사용하면 될 듯했다. 어떻게 보면 재귀를 이용해 완전 탐색하는 방법이고, 최종 결과가 0이면 출력해주면 된다.

##실패했지만 해결의 실마리를 준 풀이

def zero2(start,n,result,end):
  if start == n:
    if result == 0:
      return print(end)
    return
  next = start+1

  str_plus = end + "+" + str(next)
  zero(next,n,result+next,str_plus)

  str_minus = end + "-" + str(next)
  zero(next,n,result-next,str_minus)

# 여기서 틀려져버림ㅠㅠ
  str_empty = end + " " + str(next)
  zero(next,n,start*10+next,str_empty)

처음에는 위와 같이 문제를 풀었다. end로는 "1 + 2 3 - 4 ... " 와 같이 출력하기 위한 문자열을 계속해서 더해줬다. 위 코드는 +와 -까지는 잘 수행 되는데, empty가 왔을때 즉 수를 이어줄때 문제가 생긴다. 수를 이어주게 되면 3가지의 경우가 존재 할 수 있다. 앞에 수가 +,-,공백인데, 위 풀이는 result로 계속해서 넘겨주기 때문에 앞에가 +인지 -인지를 구분짓지 못해버린다. 그러나 여기서 답을 알 수 있었다. 넘겨주는 string은 잘 넘어가는 것을 알 수 있다. 그러면 파이썬 eval를 사용하면 되지 않나?!

 

## 성공한 풀이

def zero(target,n,text):
  if target == n :
    if eval(text.replace(" ","")) == 0 :
      return print(text)
    return

  next = target+1
  # empty
  str_empty = text + " " + str(next)
  zero(target+1,n,str_empty)

  # plus
  str_plus = text + "+" + str(next)
  zero(target+1,n,str_plus)

  # minus
  str_minus = text + "-" + str(next)
  zero(target+1,n,str_minus)

def solve():
  case = int(input())
  for _ in range(case):
    N = int(input())
    zero(1,N,"1")
    print()


if __name__ == '__main__':
    solve()

문자열을 계속해서 더해나가면서 주어진 수까지의 입력이 끝나면 eval을 이용해서 0인지 확인하고 맞다면 바로 출력해버리면 된다.

처음에는 문자열이 " " 이렇게 공백을 포함해버리니까 eval이 먹지 않았는데 replace를 활용해서 " " 공백 문자열을 빈 문자열로 바꾼다음에 계산해주면 됐다. 

 

# 마치며

출력 형식이 잘못됐습니다.. 중간에 반복문 사이에 print()를 넣어 줘야 했었다

저작자표시 (새창열림)

'•알고리즘(Algorithm ) > 문제풀이' 카테고리의 다른 글

[백준-1668] 트로피 진열 파이썬  (0) 2022.08.09
[백준-2751] 수 정렬하기2 파이썬  (0) 2022.08.09
[백준-1074] Z 파이썬 풀이  (0) 2022.08.08
[백준-2747] 피보나치 수 파이썬, 재귀함수 시간초과 메모이제이션 방법사용  (0) 2022.08.08
[백준-10989] 수 정렬하기3 파이썬, 계수정렬  (0) 2022.08.07
    '•알고리즘(Algorithm )/문제풀이' 카테고리의 다른 글
    • [백준-1668] 트로피 진열 파이썬
    • [백준-2751] 수 정렬하기2 파이썬
    • [백준-1074] Z 파이썬 풀이
    • [백준-2747] 피보나치 수 파이썬, 재귀함수 시간초과 메모이제이션 방법사용
    김호쭈
    김호쭈
    공부하고 정리하고 기록하기

    티스토리툴바