[Programmers] λ±κ΅£κΈΈ - λμ νλ‘κ·Έλλ°
π Link
https://school.programmers.co.kr/learn/courses/30/lessons/42898
π€ Think
μ°μνν ν¬μΊ ν μ½λ©ν μ€νΈ λ¬Έμ μ€ κ±°μ λκ°μ ννμ λ¬Έμ λ₯Ό νμλ κΈ°μ΅μ΄ μμ΄μ νμ΄λ²μ μ½κ² λ μ¬λ¦΄ μ μμμ΅λλ€.
μλ λλ μ€λ₯Έμͺ½μΌλ‘λ§ μ΄λνκΈ° λλ¬Έμ κ΅μ₯ν μ½κ² νμ΄κ° κ°λ₯ν©λλ€.
[a , b]μ λλ¬νλ μ΅λ¨κ±°λ¦¬λ [a-1 , b]κΉμ§ λλ¬νλ μ΅λ¨ 거리μ μ + [a , b-1]κΉμ§ λλ¬νλ μ΅λ¨ 거리μ μ μ λλ€.
μ΅λ¨κ±°λ¦¬λ‘ λλ¬ν μ μλ μ§μμ -1λ‘ μ²λ¦¬νμ΅λλ€. 0μΌλ‘ μ²λ¦¬νλ©΄ μ΄κΈ°ν ν μ΄μ°¨μ λ°°μ΄μμ μ΄κΉκ°κ³Ό ꡬλΆνκΈ° μν΄μμ λλ€.
μ΄ν 2μ°¨μ λ°°μ΄μ μ±μλκ°λλ€. O(N^2)λ§νΌμ μκ°λ³΅μ‘λκ° λ°μν©λλ€.
π Solve
- nν mμ΄ ν¬κΈ°μ 2μ°¨μ λ°°μ΄μ μμ±νκ³ 1νκ³Ό 1μ΄μ 1λ‘ μ±μμ€λλ€.
- μ΅λ¨κ±°λ¦¬λ‘ λλ¬ν μ μλ μ§μμ -1λ‘ μ²λ¦¬ν©λλ€.
- μ΄ λ, 1νκ³Ό 1μ΄μ λ€μ λλ©° λ§μΌ [n-1 , 0] λλ [0 , n-1] λ² μΉΈμ΄ -1μ΄λ©΄ μ΄ν μΉΈμ μ λΆ -1λ‘ μ²λ¦¬ν©λλ€. μ΅λ¨κ±°λ¦¬λ‘ λλ¬ν μ μλ κ²½λ‘κ° μ¬λΌμ§ κ²μ΄κΈ° λλ¬Έμ λλ€.
- 2μ°¨μ λ°°μ΄μ λλ©° [2,1] μμλΆν° μμλλ‘ λ°°μ΄μ μ±μκ°λλ€.
- λ§μΌ μ΅μ’
λͺ©μ μ§μ λμ°©νλ μ΅μ κ²½λ‘μ μκ° μμΌλ©΄ 0μ λ°λ‘ λ°νν©λλ€.
- λμ°©ν μ μλ κ²½μ°μλ -1μ΄ μ μ₯λμ΄ μκΈ° λλ¬Έμ λλ€.
π» Code
class Solution {
public int solution(int m, int n, int[][] puddles) {
int[][] map = new int[n][m];
// 1ν λ° 1μ΄ μ΄κΈ°ν
for (int i = 0; i < n; i++) {
map[i][0] = 1;
}
for (int i = 0; i < m; i++) {
map[0][i] = 1;
}
// κ° μ μλ μμΉλ -1λ‘ μ²λ¦¬
for (int[] puddle : puddles) {
map[puddle[1] - 1][puddle[0] - 1] = -1;
}
// λ§μΌ 1μ΄ λ° 1νμμ κ° μ μλ μ§μμ΄ μμΌλ©΄ μ΄νλ‘λ κ° μ μλ μ΅μ κ²½λ‘λ μμ
for (int i = 1; i < n; i++) {
if (map[i - 1][0] == -1) {
map[i][0] = -1;
}
}
for (int i = 1; i < m; i++) {
if (map[0][i - 1] == -1) {
map[0][i] = -1;
}
}
// λ°λ‘ μ λλ λ°λ‘ μΌμͺ½ κΉμ§ κ° μ μλ μ΅μ κ²½λ‘μ ν©μ΄ νΉμ μμΉκΉμ§ κ° μ μλ μ΅μ κ²½λ‘ μ
for (int i = 1; i < n; i++) {
for (int j = 1; j < m; j++) {
if (map[i][j] == 0) {
if (map[i - 1][j] == -1) {
map[i][j] = map[i][j - 1];
continue;
}
if (map[i][j - 1] == -1) {
map[i][j] = map[i - 1][j];
continue;
}
map[i][j] = (map[i - 1][j] + map[i][j - 1]) % 1000000007;
}
}
}
// λ§μΌ κ° μ μμΌλ©΄ 0 λ°ν
if (map[n - 1][m - 1] == -1) {
return 0;
}
return map[n - 1][m - 1];
}
}