문제


<aside> 🌐

백준 1783번 - 병든 나이트

</aside>

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

  1. 2칸 위로, 1칸 오른쪽
  2. 1칸 위로, 2칸 오른쪽
  3. 1칸 아래로, 2칸 오른쪽
  4. 2칸 아래로, 1칸 오른쪽
const move = [
	(2, 1), 
	(1, 2), 
	(-1, 2), 
	(-2, 1)
];

따라서, 병든 나이트는 출발 이후로 왼쪽으로는 다시 가지 않습니다.

병든 나이트는 여행을 시작하려고 하고, 여행을 하면서 방문한 칸의 수를 최대로 하려고 한다. 병든 나이트의 이동 횟수가 4번보다 적지 않다면, 이동 방법을 모두 한 번씩 사용해야 한다. 이동 횟수가 4번보다 적은 경우(방문한 칸이 5개 미만)에는 이동 방법에 대한 제약이 없다.

병든 나이트의 이동 횟수가 4번보다 많아서 이동 방법을 모두 한 번씩 사용하려면 체스판의 가로 길이가 적어도 7 이상이어야 합니다.

화면 기록 2025-04-12 오후 7.31.21.gif

체스판의 크기가 주어졌을 때, 병든 나이트가 여행에서 방문할 수 있는 칸의 최대 개수를 구해보자.

입력

첫째 줄에 체스판의 세로 길이 N와 가로 길이 M이 주어진다. N과 M은 2,000,000,000보다 작거나 같은 자연수이다.

100 50
1 1
17 5

출력

병든 나이트가 여행에서 방문할 수 있는 칸의 개수중 최댓값을 출력한다.

48
1
4

문제풀이


  1. 방문한 칸을 세기 위해 count 변수를 선언해 줍니다.

    let count = 0;
    
  2. 체스판의 세로 길이(N)이 1이면 세로 이동이 불가능하므로 이동할 수 없습니다. 따라서 병든 나이트는 시작 위치만 방문합니다.

    if(N === 1){
    	count = 1
    }
    
  3. 체스판의 세로 길이(N)이 2이면 1칸 위로, 2칸 오른쪽(1, 2) 혹은 1칸 아래로, 2칸 오른쪽(-1, 2)으로만 이동할 수 있습니다.

    이 때에는 체스판의 가로 길이(M)에 따라 오른쪽으로 갈 수 있는 만큼만 위, 아래로 이동하면서 움직일 수 있습니다. 2칸씩 이동하므로 가로 길이를 2로 나눈 만큼 이동할 수 있습니다.

    문제에 따르면 4번 이상 이동하려면 모든 이동을 다 써야 하므로, 이 경우에는 모든 이동을 다 사용하지 못하니 딱 4번까지만 이동할 수 있습니다.

    if(N === 2) {
    	count = Math.min(4, Math.ceil(M / 2))
    }