|
| 1 | +/** |
| 2 | + * 3μ°¨ (μκ°, κ³΅κ° λ³΅μ‘λ κ°μ ) |
| 3 | + * λμΌν downλ°©ν₯, rightλ°©ν₯λ€ μ€μμ λμ΄νλ λ°©λ² |
| 4 | + * μ¦, ((m - 1) + (n - 1))! / ((m - 1)! * (n - 1)!) |
| 5 | + * (+ ν©ν 리μΌμ μλ λ§€μ° λΉ λ₯΄κ² 컀μ§λ―λ‘ μ€κ° λλμ
μ΄ κ°λ₯ν λλ§λ€ λλμ΄μ integer λ²μλ₯Ό λμ§ μλλ‘ λ°©μ§) |
| 6 | + * |
| 7 | + * TC: O(M + N) |
| 8 | + * 1λΆν° μ΅λ (M - 1) + (N + 1)κΉμ§ μν |
| 9 | + * |
| 10 | + * SC: O(1) |
| 11 | + * κ³μ°μ κ²°κ³Ό λ³μκ° m, nκ³Ό 무κ΄νλ―λ‘ μμμ 곡κ°λ³΅μ‘λ |
| 12 | + */ |
| 13 | + |
| 14 | +/** |
| 15 | + * @param {number} m |
| 16 | + * @param {number} n |
| 17 | + * @return {number} |
| 18 | + */ |
| 19 | +var uniquePaths = function (m, n) { |
| 20 | + // 1. downλ°©ν₯, rightλ°©ν₯μ μ |
| 21 | + const NUMBER_OF_DOWN = m - 1; |
| 22 | + const NUMBER_OF_RIGHT = n - 1; |
| 23 | + |
| 24 | + // 2. factorial κ³μ°μ μν λ³μ |
| 25 | + let result = 1; |
| 26 | + let factorialOfDown = 1; |
| 27 | + let factorialOfRight = 1; |
| 28 | + |
| 29 | + // 3. 'downλ°©ν₯ μ + rightλ°©ν₯ μ'λ§νΌ μννλ©΄μ |
| 30 | + for (let number = 1; number <= NUMBER_OF_DOWN + NUMBER_OF_RIGHT; number++) { |
| 31 | + result *= number; |
| 32 | + |
| 33 | + // 4. factorial κ°λ€μ΄ 컀μ§μ§ μλλ‘ λλμ μμλλ§λ€ λλ (factorial of down) |
| 34 | + if (number <= NUMBER_OF_DOWN) { |
| 35 | + factorialOfDown *= number; |
| 36 | + if (result % factorialOfDown === 0) { |
| 37 | + result /= factorialOfDown; |
| 38 | + factorialOfDown = 1; |
| 39 | + } |
| 40 | + } |
| 41 | + |
| 42 | + // 5. factorial κ°λ€μ΄ 컀μ§μ§ μλλ‘ λλμ μμλλ§λ€ λλ (factorial of right) |
| 43 | + if (number <= NUMBER_OF_RIGHT) { |
| 44 | + factorialOfRight *= number; |
| 45 | + if (result % factorialOfRight === 0) { |
| 46 | + result /= factorialOfRight; |
| 47 | + factorialOfRight = 1; |
| 48 | + } |
| 49 | + } |
| 50 | + } |
| 51 | + |
| 52 | + return result / factorialOfDown / factorialOfRight; |
| 53 | +}; |
| 54 | + |
| 55 | +/** |
| 56 | + * 2μ°¨ (곡κ°λ³΅μ‘λ κ°μ ) |
| 57 | + * μ΄μ νμ΄μμ λͺ¨λ νμ κ²½λ‘μλ₯Ό κΈ°μ΅ν νμκ° μλ μ μ νμ© |
| 58 | + * |
| 59 | + * TC: O(M * N) |
| 60 | + * κ²½λ‘ μλ₯Ό κΈ°λ‘νκΈ° μν Nλ°°μ΄ μν * (M - 1) |
| 61 | + * |
| 62 | + * SC: O(N) |
| 63 | + * κ²½λ‘μ κΈ°λ‘μ μν 1μ°¨μ λ°°μ΄ |
| 64 | + */ |
| 65 | + |
| 66 | +/** |
| 67 | + * @param {number} m |
| 68 | + * @param {number} n |
| 69 | + * @return {number} |
| 70 | + */ |
| 71 | +var uniquePaths = function (m, n) { |
| 72 | + // 1. μ΅μλ¨μ κ²½λ‘μλ λͺ¨λ 1 |
| 73 | + const numberOfPaths = new Array(n).fill(1); |
| 74 | + |
| 75 | + for (let row = 1; row < m; row++) { |
| 76 | + // 2. κ° μ’νμ κ²½λ‘μλ νμ’ν(1μ°¨ νμ΄μ row-1)μ μ’μΈ‘μ’ν(1μ°¨ νμ΄μ column-1)μ ν© |
| 77 | + for (let column = 1; column < n; column++) { |
| 78 | + numberOfPaths[column] += numberOfPaths[column - 1]; |
| 79 | + } |
| 80 | + } |
| 81 | + |
| 82 | + return numberOfPaths[n - 1]; |
| 83 | +}; |
| 84 | + |
| 85 | +/** |
| 86 | + * 1μ°¨ |
| 87 | + * κ° μ’νμ κ²½λ‘μλ₯Ό κΈ°λ‘νμ¬ dpλ‘ νμ΄ |
| 88 | + * νμ’νκΉμ§μ κ²½λ‘μ = μλ¨μ’νμμ μ¨ κ²½μ° + μ’μΈ‘μ’νμμ μ¨ κ²½μ° |
| 89 | + * dp[row][column] = dp[row - 1][column] + dp[row][column - 1] |
| 90 | + * |
| 91 | + * |
| 92 | + * TC: O(M * N) |
| 93 | + * κ²½λ‘μλ₯Ό κΈ°λ‘ν 2μ°¨μ λ°°μ΄μ μ 체 μν |
| 94 | + * |
| 95 | + * SC: O(M * N) |
| 96 | + * κ²½λ‘μ κΈ°λ‘μ μν 2μ°¨μ λ°°μ΄ |
| 97 | + */ |
| 98 | + |
| 99 | +/** |
| 100 | + * @param {number} m |
| 101 | + * @param {number} n |
| 102 | + * @return {number} |
| 103 | + */ |
| 104 | +var uniquePaths = function (m, n) { |
| 105 | + // 1. κ° μ’λ£κΉμ§μ κ²½λ‘μλ₯Ό κΈ°λ‘νκΈ° μν λ°°μ΄ |
| 106 | + const numberOfPaths = new Array(m).fill(new Array(n).fill(0)); |
| 107 | + |
| 108 | + // 2. μ΅μ’μΈ‘μ μλ μ’νμ κ²½λ‘μλ 1 |
| 109 | + for (let row = 0; row < m; row++) { |
| 110 | + numberOfPaths[row][0] = 1; |
| 111 | + } |
| 112 | + |
| 113 | + // 3. μ΅μλ¨μ μλ μ’νμ κ²½λ‘μλ 1 |
| 114 | + for (let column = 0; column < n; column++) { |
| 115 | + numberOfPaths[0][column] = 1; |
| 116 | + } |
| 117 | + |
| 118 | + // 4. κ·Έ μΈ κ° μ’νλ λ°λ‘ μ μ’ν(column-1)μ λ°λ‘ μΌμͺ½ μ’ν(row-1)μ κ²½λ‘μμ ν© |
| 119 | + for (let row = 1; row < m; row++) { |
| 120 | + for (let column = 1; column < n; column++) { |
| 121 | + numberOfPaths[row][column] = |
| 122 | + numberOfPaths[row - 1][column] + numberOfPaths[row][column - 1]; |
| 123 | + } |
| 124 | + } |
| 125 | + |
| 126 | + return numberOfPaths[m - 1][n - 1]; |
| 127 | +}; |
0 commit comments