본문 바로가기
Algorithm/Programmers

프로그래머스 - N으로 표현

by HaningYa 2020. 8. 6.
728x90
 

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

 

programmers.co.kr


문제

아래와 같이 5와 사칙연산만으로 12를 표현할 수 있습니다.

12 = 5 + 5 + (5 / 5) + (5 / 5)
12 = 55 / 5 + 5 / 5
12 = (55 + 5) / 5

5를 사용한 횟수는 각각 6,5,4 입니다. 그리고 이중 가장 작은 경우는 4입니다.
이처럼 숫자 N과 number가 주어질 때, N과 사칙연산만 사용해서 표현 할 수 있는 방법 중 N 사용횟수의 최솟값을 return 하도록 solution 함수를 작성하세요.

제한사항

  • N은 1 이상 9 이하입니다.
  • number는 1 이상 32,000 이하입니다.
  • 수식에는 괄호와 사칙연산만 가능하며 나누기 연산에서 나머지는 무시합니다.
  • 최솟값이 8보다 크면 -1을 return 합니다.

입출력 예

 

N number return
     
5 12 4
2 11 3

입출력 예 설명

예제 #1
문제에 나온 예와 같습니다.

예제 #2
11 = 22 / 2와 같이 2를 3번만 사용하여 표현할 수 있습니다.


N 을 최소로 사용하여 사칙연산하여 number를 만들어야 하는 문제이다.

N=5, number=12, return=4 의 경우 

12를 만드려면 (55+5)/5 가 제일 작으므로 4번 써서 4가 정답이다.

수식을 만들어 나가야 되므로 dfs 를 사용했다.

최솟값이 8이 넘어가면 return 했고 

찾는 숫자가 되었을 경우 현재보다 N의 갯수가 작은경우 update 했다.

  • NN*10+N = NNN
  • NN/N = 11
  • (N+N)/N=2
  • N/N=1
import Foundation

var answer = -1
func solution(_ N:Int, _ number:Int) -> Int {

    dfs(N,0,0,number,"")
    return answer
}
func dfs(_ n: Int,_ pos:Int, _ num : Int,_ number: Int, _ s : String){
    if pos > 8 {return }
    if num==number {
        if pos < answer || answer == -1 {
            // print(s)
            answer = pos
        }
        return
    }
    var NN = 0
    for i in 0..<8 {
        NN = NN*10 + n
        dfs(n, pos + 1 + i, num + NN, number, s + "+")
        dfs(n, pos + 1 + i, num - NN, number, s + "-")
        dfs(n, pos + 1 + i, num * NN, number, s + "*")
        dfs(n, pos + 1 + i, num / NN, number, s + "/")
    }

}
728x90

'Algorithm > Programmers' 카테고리의 다른 글

Programmers - 타겟 넘버  (0) 2020.08.03
Programmers - 카펫  (0) 2020.06.30
Programmers - 숫자 야구 ⚾️  (0) 2020.06.30
Programmers - 소수찾기(완전탐색)  (0) 2020.06.30
Programmers - ⚖️가장 큰 수  (0) 2020.06.27

댓글