코딩스토리

백준 11048번 - 이동하기 본문

알고리즘/BOJ 문제 풀이

백준 11048번 - 이동하기

kimtaehyun98 2021. 1. 6. 21:54

www.acmicpc.net/problem/11048

 

11048번: 이동하기

준규는 N×M 크기의 미로에 갇혀있다. 미로는 1×1크기의 방으로 나누어져 있고, 각 방에는 사탕이 놓여져 있다. 미로의 가장 왼쪽 윗 방은 (1, 1)이고, 가장 오른쪽 아랫 방은 (N, M)이다. 준규는

www.acmicpc.net

dp 문제이다.

요즘 dp를 많이 풀어보고 싶어서 풀어봤는데

처음 봤을때 dp가 아닌줄 알았다.

 

누가봐도 bfs 문제 같아서 에라 모르겠다 하고 bfs로 풀다 보니 뭔가 이상..

 

bfs와 dp를 섞어서 풀다보니 뭔가 쎄~ 했다.

 

일단 예제랑 반례들 답이 잘 나오길래 제출하긴 했는데 메모리초과!!

 

역시 느낌이 중요하다니까

 

잠시 고민해봤는데 아무래도 bfs를 사용할 때 queue에 너무 많은 데이터가 들어가서 메모리 초과가 나는 것 같다.

 

그리고 나서 연습장에 끄적여 봤는데 

생각보다 너무 간단한 문제였네..?

 

내가 사용한 해결방법은 다음과 같다.

 

첫 번째 열과 첫 번째 행을 제외한 나머지 칸들은 모두 자신의 왼쪽 칸과 위쪽 칸에만 영향을 받는다!

 

 

이 문제에서 각 칸에서 오른쪽, 아래쪽, 오른쪽 대각선 아래 방향, 이 3가지 방향으로만 움직일 수 있다는 조건이 Hint였다!

 

앞에서 뭐한거지.. 이렇게 생각한 뒤에 코드를 짜는건 간단했다.

 

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
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
 
int arr[1004][1004];
int dp[1004][1004];
 
int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    memset(dp, 0sizeof(dp));
    int n, m;
    // 입력
    cin >> n >> m;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            cin >> arr[i][j];
        }
    }
    // dp 구하기
    dp[0][0= arr[0][0];
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            if (i == 0 && j == 0continue;  // [0][0]은 이미 넣어줬으니까 
            if (i == 0) dp[i][j] = dp[i][j - 1+ arr[i][j];  // 첫 번째 행은 자신의 왼쪽 칸에만 영향을 받음
            else if (j == 0) dp[i][j] = dp[i - 1][j] + arr[i][j]; // 첫 번째 열은 자신의 위쪽 칸에만 영향을 받음
            else dp[i][j] = max(dp[i][j - 1], dp[i - 1][j]) + arr[i][j]; // 나머지 칸들은 각각 왼쪽 칸과 위쪽 칸에 영향을 받음
        }
    }
    cout << dp[n - 1][m - 1<< "\n";
cs

 

dp는 차분히 생각해 보고 푸는게 더 빨리 풀 수 있는것 같다.

 

bfs처럼 무작정 구현하면서 맞춰나가는 방식으로 풀어보니 답도 없다

'알고리즘 > BOJ 문제 풀이' 카테고리의 다른 글

백준 17404번 - RGB거리 2  (0) 2021.01.20
백준 9251번 - LCS  (0) 2021.01.15
백준 1005번 - ACM Craft  (0) 2021.01.01
백준 2056번 - 작업  (0) 2021.01.01
Educational Codeforces Round 98 (Rated for Div. 2) - C번  (0) 2020.12.27
Comments