[백준/C++] 1783 - 병든 나이트

정승우·2021년 2월 20일
0

[백준/C++] BOJ 공부

목록 보기
12/25

문제링크: https://www.acmicpc.net/problem/1783

문제


병든 나이트가 N × M 크기 체스판의 가장 왼쪽아래 칸에 위치해 있다. 병든 나이트는 건강한 보통 체스의 나이트와 다르게 4가지로만 움직일 수 있다.

  1. 2칸 위로, 1칸 오른쪽
  2. 1칸 위로, 2칸 오른쪽
  3. 1칸 아래로, 2칸 오른쪽
  4. 2칸 아래로, 1칸 오른쪽

병든 나이트는 여행을 시작하려고 하고, 여행을 하면서 방문한 칸의 수를 최대로 하려고 한다. 병든 나이트의 이동 횟수가 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;
}

문제는 엄청난 시뮬레이션을 돌려야 하는 것 처럼 꾸며놨지만 실은 규칙찾는 문제이다.
이 문제의 설명은 주석에 달아둔 규칙을 이해하는 것으로 대신하자.

노트


이 문제도 지난번 문제와 마찬가지로 오해할만한 문제였다.
쉬운문제를 어려운 문제로 착각해서 고민을 오래하지 말자.

profile
Computer Science & Engineering 19

0개의 댓글