알고리즘 문제 풀이
프로그래머스 - N 으로 표현 [코틀린]
블린더르
2021. 2. 7. 20:53
처음 DP 문제를 풀어보았는데 생각하지 못한 부분들 때문에 풀이가 쉽지 않았다.
놓친 부분
- NN, NNN 등 의 같은 숫자가 나열되는 부분을 생각하지 않고 사칙연산만 고려함
- 바로 전에 계산한 값들에 사칙연산만 했음
- 꼭 문자열을 이용해서 계산하지 않아도 됐음
코드
/*
* 2021-02-07
* https://programmers.co.kr/learn/courses/30/lessons/42895
*/
fun expressedByN(N: Int, number: Int): Int {
val resultList = mutableListOf<MutableSet<Int>>()
var linearNum = 0
for (i in 0..8) {
linearNum = linearNum * 10 + N
val set = mutableSetOf(linearNum)
for (j in 0 until i) {
resultList[j].forEach { num ->
resultList[i - j - 1].forEach { num2 ->
cal(num, num2, set)
}
}
}
if (set.contains(number)) {
return i + 1
}
resultList.add(i, set)
}
return -1
}
fun cal(num1: Int, num2: Int, set: MutableSet<Int>) {
set.add(num1 + num2)
set.add(num1 - num2)
set.add(num1 * num2)
if (num2 != 0) {
set.add(num1 / num2)
}
if (num1 != 0) {
set.add(num2 / num1)
}
}
테스트 코드
class DynamicProgrammingTest {
companion object {
@JvmStatic
fun expressedByNArgs(): Stream<Arguments> = Stream.of(
Arguments.of(5, 12, 4),
Arguments.of(2, 11, 3),
Arguments.of(5, 31168, -1),
Arguments.of(1, 1121, 7),
Arguments.of(5, 3600, 6),
)
}
@ParameterizedTest
@MethodSource("expressedByNArgs")
fun testExpressedByNArgs(N: Int, number: Int, answer: Int) {
assertEquals(answer, expressedByN(N, number))
}
}
참고
반응형