* 문제
문제
병든 나이트가 N × M 크기 체스판의 가장 왼쪽아래 칸에 위치해 있다. 병든 나이트는 건강한 보통 체스의 나이트와 다르게 4가지로만 움직일 수 있다.
- 2칸 위로, 1칸 오른쪽
- 1칸 위로, 2칸 오른쪽
- 1칸 아래로, 2칸 오른쪽
- 2칸 아래로, 1칸 오른쪽
병든 나이트는 여행을 시작하려고 하고, 여행을 하면서 방문한 칸의 수를 최대로 하려고 한다. 병든 나이트의 이동 횟수가 4번보다 적지 않다면, 이동 방법을 모두 한 번씩 사용해야 한다. 이동 횟수가 4번보다 적은 경우(방문한 칸이 5개 미만)에는 이동 방법에 대한 제약이 없다.
체스판의 크기가 주어졌을 때, 병든 나이트가 여행에서 방문할 수 있는 칸의 최대 개수를 구해보자.
입력
첫째 줄에 체스판의 세로 길이 N와 가로 길이 M이 주어진다. N과 M은 2,000,000,000보다 작거나 같은 자연수이다.
출력
병든 나이트가 여행에서 방문할 수 있는 칸의 개수중 최댓값을 출력한다.
* 접근 방식
- 오른쪽으로 밖에 갈 수 없으며 높이가 최대 2부터 갈 수 있다.
- 높이가 2인 경우는 최대 3번이동할 수 있다.
- 높이가 3인 경우는 X값만 여유롭다면 얼마든지 이동할 수 있다. X값에 따라 변하는 경계를 잘 확인해야한다.
#include <iostream>
#include <vector>
using namespace std;
int main(void)
{
ios_base::sync_with_stdio(0);
cin.tie(0);
int MaxY = 0;
int MaxX = 0;
cin >> MaxY >> MaxX;
int knightY = MaxY -1;
int knightX = 0;
int result = 0;
if (1 == MaxY)
{
result = 1;
}
else if (2 == MaxY)
{
result = 1 + (MaxX - 1) / 2;
if (4 < result)
{
result = 4;
}
}
else // if(3 <= MaxY)
{
result = 1;
// 6칸의 여유가 있으면 4곳을 방문할 수 있다.
if (2 >= (MaxX - 1))
{
result += (MaxX - 1);
}
else if (3 <= (MaxX - 1) && 5 >= (MaxX - 1))
{
result += 3;
}
else
{
result += 2 + (MaxX - 1 - 4);
}
}
cout << result << endl;
return 0;
}
'알고리즘 문제 풀이 > 백준' 카테고리의 다른 글
[10815번] 숫자 카드 (0) | 2022.04.07 |
---|---|
[12904번] A와 B (0) | 2022.04.07 |
[2875번] 대회 or 인턴 (0) | 2022.04.06 |
[1541번] 잃어버린 괄호 (0) | 2022.04.05 |
[12015] 가장 긴 증가하는 부분 수열 2 (0) | 2022.04.05 |