등교길이 아니라 등굣길이라니
계속되는 폭우로 일부 지역이 물에 잠겼습니다. 물에 잠기지 않은 지역을 통해 학교를 가려고 합니다. 집에서 학교까지 가는 길은 m x n 크기의 격자모양으로 나타낼 수 있습니다.
아래 그림은 m = 4, n = 3 인 경우입니다.
가장 왼쪽 위, 즉 집이 있는 곳의 좌표는 (1, 1)로 나타내고 가장 오른쪽 아래, 즉 학교가 있는 곳의 좌표는 (m, n)으로 나타냅니다.
격자의 크기 m, n과 물이 잠긴 지역의 좌표를 담은 2차원 배열 puddles이 매개변수로 주어집니다. 오른쪽과 아래쪽으로만 움직여 집에서 학교까지 갈 수 있는 최단경로의 개수를 1,000,000,007로 나눈 나머지를 return 하도록 solution 함수를 작성해주세요.
map[i][j]
에서 목적지로 갈 수 있는 경로 수는 map[i-1][j] + map[i][j-1]
이다. 이걸 처음부터 끝까지 웅덩이 없는 곳만 골라서 반복하면 된다.집 -> 학교
를 하니까 풀이가 생각이 안 나서 학교를 기준으로 보았다.위
와 왼쪽
에서 올 수 있는 경우는 각각 한 가지씩이다.위로 한 칸
왼쪽으로 한 칸
이동한 위치는 오른쪽
과 아래쪽
으로 갈 수 있어서 두 가지이다.row++
를 먼저 해주고 col++
를 해주었다.돌멩
집에서 학교
를 가나 학교에서 집
을 가나 똑같다는 생각이 들었다. 난 멍청이다.
x
y
만 조금 수정해주었다.x
와 y
가 계속 발목을 잡았다.수정했다.
map[1][1]
을 1로 초기화해도 loop 돌면서 0으로 다시 초기화시키길래 map[1][1]
을 웅덩이로 처리해서 그냥 지나치게 해버렸다.#include <string>
#include <vector>
using namespace std;
int map[100][100];
bool puddle_map[100][100];
int solution(int m, int n, vector<vector<int>> puddles) {
map[0][0] = 1;
for(int i=0; i<puddles.size(); i++){
int x = puddles[i][1] - 1;
int y = puddles[i][0] - 1;
puddle_map[x][y] = true;
}
for(int i=1; i<n; i++){
if(puddle_map[i][0]) continue;
map[i][0] = map[i-1][0];
}
for(int i= 1; i<m; i++){
if(!puddle_map[0][i]) map[0][i] = map[0][i-1];
for(int j=1; j<n; j++){
if(puddle_map[j][i]) continue;
map[j][i] = (map[j-1][i] + map[j][i-1]) % 1000000007;
}
}
return map[n-1][m-1];
}
#include <string>
#include <vector>
using namespace std;
int map[101][101];
bool puddle_map[101][101];
int solution(int m, int n, vector<vector<int>> puddles) {
for(int i=0; i<puddles.size(); i++){
int x = puddles[i][1];
int y = puddles[i][0];
puddle_map[x][y] = true;
}
map[1][1] = 1;
puddle_map[1][1] =true;
for(int i= 1; i<=m; i++){
for(int j=1; j<=n; j++){
if(puddle_map[j][i]) continue;
map[j][i] = (map[j-1][i] + map[j][i-1]) % 1000000007;
}
}
return map[n][m];
}
puddle_map
배열을 만들지 않고 풀었다.puddle_map
배열을 만들지 않아 연산이 아주 조금 복잡해졌다.arr
를 101 X 101
배열로 만든다.i == 0 || j == 0
인 배열의 항목은 0으로 초기화한다.i == 0 || j == 0
인 배열의 항목은 실제 길이 아니라 계산을 위해만 존재한다,arr[1][1] = 1
로 초기화 한다.puddles
의 위치의 arr
는 0으로 초기화한다.arr[i][j] = arr[i-1][j] + arr[i][j-1]
이다.arr[1][1]
이 다른 값으로 바뀌지 않기 위해 i == 1 && j == 1
이면 건너뛴다.puddle
이 있는 위치는 계산을 하지 않고 건너 뛴다.arr[n][m]
을 return
하면 된다.#include <string>
#include <vector>
using namespace std;
int solution(int m, int n, vector<vector<int>> puddles) {
int arr[101][101] = {0, };
for (int i = 1; i < 101; ++i) {
for (int j = 1; j < 101; ++j) {
arr[i][j] = -1;
}
}
for (vector<int> puddle : puddles) {
arr[puddle[1]][puddle[0]] = 0;
}
arr[1][1] = 1;
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= m; ++j) {
if (arr[i][j] == 0 || (i == 1 && j == 1)) continue;
else arr[i][j] = (arr[i][j - 1] + arr[i-1][j]) % 1000000007;
}
}
return arr[n][m];
}