문제링크: https://www.acmicpc.net/problem/1783
병든 나이트가 N × M 크기 체스판의 가장 왼쪽아래 칸에 위치해 있다. 병든 나이트는 건강한 보통 체스의 나이트와 다르게 4가지로만 움직일 수 있다.
병든 나이트는 여행을 시작하려고 하고, 여행을 하면서 방문한 칸의 수를 최대로 하려고 한다. 병든 나이트의 이동 횟수가 4번보다 적지 않다면, 이동 방법을 모두 한 번씩 사용해야 한다. 이동 횟수가 4번보다 적은 경우(방문한 칸이 5개 미만)에는 이동 방법에 대한 제약이 없다.
체스판의 크기가 주어졌을 때, 병든 나이트가 여행에서 방문할 수 있는 칸의 최대 개수를 구해보자.
첫째 줄에 체스판의 세로 길이 N와 가로 길이 M이 주어진다. N과 M은 2,000,000,000보다 작거나 같은 자연수이다.
병든 나이트가 여행에서 방문할 수 있는 칸의 개수중 최댓값을 출력한다.
#include <iostream>
#include <algorithm>
int main() {
std::ios::sync_with_stdio(false);
std::cout.tie(NULL);
std::cin.tie(NULL);
int N;
int M;
std::cin >> N >> M;
int ans = 0;
// n = 2;
// m <= 2; 1
// m <= 4; 2
// .
// m >= 9; 4
// n = 3;
// if m < 7; 4
// else m; m - 2
if (N == 1) {
ans = 1;
}
else if (N == 2) {
ans = std::min(4, (M + 1) / 2);
}
else {
if (M < 7) {
ans = std::min(4, M);
}
else {
ans = M - 2;
}
}
std::cout << ans << "\n";
return 0;
}
문제는 엄청난 시뮬레이션을 돌려야 하는 것 처럼 꾸며놨지만 실은 규칙찾는 문제이다.
이 문제의 설명은 주석에 달아둔 규칙을 이해하는 것으로 대신하자.
이 문제도 지난번 문제와 마찬가지로 오해할만한 문제였다.
쉬운문제를 어려운 문제로 착각해서 고민을 오래하지 말자.