개발/algorithm

[프로그래머스][level3] N으로 표현 -python

zzi_on2 2021. 12. 31. 14:28

문제 링크

https://programmers.co.kr/learn/courses/30/lessons/42895

 

코딩테스트 연습 - N으로 표현

 

programmers.co.kr

풀이

  • 다른 블로그 글을 참고했는데 이해가 안돼서 한참 보고 있었다 ...ㅠㅠ 
  • 코드는 아래와 같고, n번 반복해서 만들 수 있는 숫자들의 집합은 {n번 연결해서 붙인 숫자} U { i번 반복해서 만들 수 있는 숫자와 n-i 번 반복해서 만들 수 있는 숫자들의 사칙 연산} 임을 코드로 표현한 것이다. 
def solution(N, number):
    # dp[i]는 N을 i번 사용해서 나타낼 수 있는 수들의 집합 
    # N을 i번 반복한 수 넣기. i의 최솟값 8
    dp = [[int(str(N)*i)] for i in range(1,9)]

    # N을 사용한 횟수 
    for i in range(8):
      for j in range(i):
        for num1 in dp[j]:# i번 사용해서 나타낼 수 있는 수
           for num2 in dp[i-j-1]: # N-i번 사용해서 나타낼 수 있는 수 
              dp[i].append(num1+num2)
              dp[i].append(num1-num2)
              dp[i].append(num1*num2)
              if num2 != 0 :
                dp[i].append(num1//num2)
      # dp[i]에 number가 있다면 정답 반환 
      if number in dp[i]:
        return i+1
    return -1

- 2022.03.29 다시 풀이 

- dfs 로도 풀 수 있다 

ans = int(1e9)

def dfs(n, cnt, num, number):
    
    global ans
    
    # 사용한 횟수가 최솟값보다 크면 중단 
    if ans < cnt :
        return 
    
    # 사용한 횟수가 8보다 크면 중단 
    if cnt > 8 :
        return 
    
    # 만들어진 숫자가 구하고자 하는 숫자이면 
    if num == number:
        # 사용한 횟수 최솟값 갱신 
        ans = min(ans, cnt)
        return 
     
    # 연속된 숫자    
    next_num = 0 
    
    # 최소 연산 횟수 8까지 반복 
    for i in range(8):
        # 연속된 숫자만들기 
        next_num = next_num*10 + n 
        # 더하기 연산 
        dfs(n, cnt + 1 + i, num + next_num, number)
        # 빼기 연산 
        dfs(n, cnt + 1 + i, num - next_num, number)
        # 곱하기 연산 
        dfs(n, cnt + 1 + i, num * next_num, number)
        # 나누기 연산 
        dfs(n, cnt + 1 + i, num / next_num, number)

def solution(N, number):

    # 사용할 숫자, 사용한 횟수, 현재 값, 만들 숫자 
    dfs(N, 0, 0, number)
    
    # 8보다 적게 사용해서 만들 수 없다면 
    if ans == int(1e9):
        return -1
    else:    
        return ans