※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 11048번 문제인 이동하기이다.
문제는 아래 링크를 확인하자.
11048번: 이동하기
준규는 N×M 크기의 미로에 갇혀있다. 미로는 1×1크기의 방으로 나누어져 있고, 각 방에는 사탕이 놓여져 있다. 미로의 가장 왼쪽 윗 방은 (1, 1)이고, 가장 오른쪽 아랫 방은 (N, M)이다. 준규는
www.acmicpc.net
이 문제에서는 미로의 칸을 위에서 아래 행 방향으로, 같은 행이라면 왼쪽에서 오른쪽 열 방향으로 둘러보면서 이 칸으로 진입할 때 왼쪽에서 진입하는 것과 위쪽에서 진입하는 것중 어떤 경우에 더 많은 사탕을 얻는지 살펴 기록해나가는 것으로 풀 수 있다.
대각선 방향의 이동은 따로 고려할 필요가 없는데, 가장 많은 사탕을 줍는 경로 중 최단거리까지 구하는 것을 문제가 요구하고 있지 않기 때문이다.
대각선 방향의 이동이 포함된 경로가 가장 많은 사탕을 줍는 경로라면, 그 대각선 경로 대신 아래방향 한칸 이동과 오른쪽방향 한칸 이동을 대신 해도 기존 경로에 있는 사탕을 모두 주으므로 오른쪽방향 이동과 아래방향 이동만 고려해도 상관이 없다.
아래는 제출한 소스코드이다.
#include <iostream>
#include <cmath>
using std::cin; using std::cout;
using std::max;
int arr[1001][1001];
int main()
{
std::ios::sync_with_stdio(0);
cin.tie(0);
int row, column; cin >> row >> column;
int x;
for (int i = 1;i <= row;i++) {
for (int j = 1;j <= column;j++) {
cin >> x; arr[i][j] = x;
arr[i][j] += max(arr[i-1][j], arr[i][j-1]);
}
}
cout << arr[row][column];
return 0;
}
728x90
'BOJ' 카테고리의 다른 글
[BOJ 12728 // C++] n제곱 계산 (0) | 2021.03.16 |
---|---|
[BOJ 2294 // C++] 동전 2 (0) | 2021.03.15 |
[BOJ 11055 // C++] 가장 큰 증가 부분 수열 (0) | 2021.03.13 |
[BOJ 17528 // C++] Two Machines (0) | 2021.03.12 |
[BOJ 1991 // C++] 트리 순회 (0) | 2021.03.11 |