맵의 크기가 작고, 경우의 수가 적아서 그냥 DFS로 풀었다. 근데, 다른 사람들이 0msec이 나오는게 아닌가!!나는 100msec 정도인데...혹시나하고 보니 DP문제였다...ㅎㅎ
O이 주어지면 정답은 : O까지 가는 경우의 수 * N,M 까지 가는 경우의 수
없으면 N, M까지 가는 경우의 수 이다!!
DFS는 원하는 지점까지 가면, 1을 반환하고 재귀가 종료되면 지금까지 반환 된 값을 반환하는 식으로 구성하였다. 설명하려니까 어렵다. 코드를 보자!!그럼 이해가 될 것이다!!
DP는 비슷하게 반환 된 경우의 수를 DP배열에 저장해 두었고, DP 배열에 이미 경우의 수가 존재하면 현재 저정 된 배열의 값을 반환하는 구성이다.! 역시 글로 쓰자니 어렵다. 코드를 보자!
DFS로 푼 것.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 | #include <stdio.h> #include <string.h> typedef struct { int y, x; }point; point Zero; int map[16][16]; int N, M, O, total; int DFS(int y, int x, int yy, int xx) { if (y > yy || x > xx) return 0; if (y == yy && x == xx) { return 1; } return DFS(y, x + 1, yy, xx) + DFS(y + 1, x, yy, xx); } int main() { memset(map, -1, sizeof(map)); scanf("%d %d %d", &N, &M, &O); for (int i = 1; i <= N; i++) { for (int j = 1; j <= M; j++) { map[i][j] = (i - 1)*M + j; if (map[i][j] == O) { Zero.y = i; Zero.x = j; } } } if (O == 0) { total = DFS(1, 1, N, M); } else { total = DFS(1, 1, Zero.y, Zero.x) * DFS(Zero.y, Zero.x, N, M); } printf("%d\n", total); return 0; } | cs |
DP로 푼 것.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 | #include <stdio.h> #include <string.h> typedef struct { int y, x; }point; point Zero; int map[16][16]; int DP[16][16]; int N, M, O, total; int DFS(int y, int x, int yy, int xx) { if (y > yy || x > xx) return 0; if (DP[y][x]) return DP[y][x]; if (y == yy && x == xx) { return 1; } DP[y][x] = DFS(y, x + 1, yy, xx) + DFS(y + 1, x, yy, xx); return DP[y][x]; } int main() { memset(map, -1, sizeof(map)); scanf("%d %d %d", &N, &M, &O); for (int i = 1; i <= N; i++) { for (int j = 1; j <= M; j++) { map[i][j] = (i - 1)*M + j; if (map[i][j] == O) { Zero.y = i; Zero.x = j; } } } if (O == 0) { total = DFS(1, 1, N, M); } else { total = DFS(1, 1, Zero.y, Zero.x) * DFS(Zero.y, Zero.x, N, M); } printf("%d\n", total); return 0; } | cs |
'SW 업무 관련 > 백준' 카테고리의 다른 글
[C언어] 15683. 감시 (0) | 2018.09.26 |
---|---|
[C언어] 3108. 로고 (0) | 2018.09.26 |
[C언어] 14888. 연산자 끼워넣기 (0) | 2018.09.25 |
[C언어] 15686. 치킨배달 (0) | 2018.09.25 |
[C언어] 14889 스타트와 링크 (0) | 2018.09.25 |