ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 프로그래머스 - 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

    반응형

    댓글

Designed by Tistory.