반응형
https://www.acmicpc.net/problem/11048
11048번: 이동하기
준규는 N×M 크기의 미로에 갇혀있다. 미로는 1×1크기의 방으로 나누어져 있고, 각 방에는 사탕이 놓여져 있다. 미로의 가장 왼쪽 윗 방은 (1, 1)이고, 가장 오른쪽 아랫 방은 (N, M)이다. 준규는 현재 (1, 1)에 있고, (N, M)으로 이동하려고 한다. 준규가 (r, c)에 있으면, (r+1, c), (r, c+1), (r+1, c+1)로 이동할 수 있고, 각 방을 방문할 때마다 방에 놓여져있는 사탕을 모두 가져갈 수 있다. 또, 미로 밖으
www.acmicpc.net
문제 접근 방법
- 원점으로부터 이동 할 수 있는 위치를 파악한다(우측, 우측 대각선 아래, 아래) 3가지 방향이다.
- 이동되는 점의 기준으로 보면 자신으로 올 수 있는 곳은 좌측, 좌측 대각선 위, 위 이렇게 3가지 방향이다.
- 가져올 수 있는 최대 사탕의 갯수를 구해야 하기 때문에 자신에게 올 수 있는 방향의 사탕 갯수를 비교하여 그중 가장 큰 값과 현재 자신 위치의 사탕 갯수를 더하면 최댓값이 된다.
아래는 코드입니다.
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
|
#include <iostream>
using namespace std;
int candyMap[1001][1001];
int totalCandy[1001][1001];
int MaxCheck(int a, int b, int c) // 3개중 가장 큰 것을 리턴하는 함수
{
return a > b ? (a > c ? a : c ) : b > c ? b : c;
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(0);
int N, M;
cin >> N >> M;
for (int i = 1; i <= N; i++)
{
for (int j = 1; j <= M; j++)
{
cin >> candyMap[i][j];
}
}
for (int i = 1; i <= N; i++)
{
for (int j = 1; j <= M; j++)
{
totalCandy[i][j] = MaxCheck(totalCandy[i - 1][j], totalCandy[i - 1][j - 1], totalCandy[i][j - 1]) + candyMap[i][j]; // 올 수 있는 방향 3가지로부터 비교하여 최대값 + 도달 위치에 있는 사탕 갯수를 더함
}
}
cout << totalCandy[N][M] << "\n";
return 0;
}
Colored by Color Scripter
|
반응형
'백준 문제풀이 > SILVER' 카테고리의 다른 글
[백준 / BOJ / SILVER 5] 1476 번 : 날짜 계산 (0) | 2020.03.04 |
---|---|
[백준 / BOJ / SILVER 3] 1748 번 : 수 이어쓰기 1 (0) | 2020.03.01 |
[백준 / BOJ / SILVER 1] 6064 번 : 카잉 달력 (0) | 2020.02.28 |
[백준 / BOJ / SILVER 2] 1890 번 : 점프 (0) | 2020.02.28 |
[백준 / BOJ / SILVER 2] 3184 번 : 양 (0) | 2020.02.26 |