알고리즘 문제 풀이

프로그래머스 - N 으로 표현 [코틀린]

블린더르 2021. 2. 7. 20:53

처음 DP 문제를 풀어보았는데 생각하지 못한 부분들 때문에 풀이가 쉽지 않았다.

놓친 부분

  1. NN, NNN 등 의 같은 숫자가 나열되는 부분을 생각하지 않고 사칙연산만 고려함
  2. 바로 전에 계산한 값들에 사칙연산만 했음
  3. 꼭 문자열을 이용해서 계산하지 않아도 됐음

코드

/*
 * 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))
  }
}

참고

https://gurumee92.tistory.com/164

반응형