문제 출처
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
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번만 사용하여 표현할 수 있습니다.
Solution
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// | |
// ExpressedAsN.swift | |
// ProgrammingProblems | |
// | |
// Copyright © 2020 roseMelon. All rights reserved. | |
// | |
import Foundation | |
func solution(_ N:Int, _ number:Int) -> Int { | |
if N == number { return 1 } | |
return step(state: [[],[N],[justNumber(N, reapeat: 2), N*N, N+N, 1]], N: N, counter: 2, Number: number) | |
} | |
func step(state: [Set<Int>], N: Int, counter: Int, Number: Int) -> Int { | |
if counter > 8 { return -1 } | |
if let last = state.last, last.contains(Number) { return counter } | |
var newState: Set<Int> = [justNumber(N, reapeat: counter + 1)] | |
for i in 1..<counter+1 { | |
state[i].forEach { x in | |
state[counter+1 - i].forEach { y in | |
let newValues = [x+y, x-y, x/y, x*y] | |
newValues.forEach { new in | |
guard new != 0 else { return } | |
newState.insert(new) | |
} | |
} | |
} | |
} | |
return step(state: state + [newState], N: N, counter: counter + 1, Number: Number) | |
} | |
func justNumber(_ N: Int, reapeat: Int) -> Int { | |
return Int(String(repeating: String(N), count: reapeat))! | |
} |