[백준 1783 - 병든 나이트]
문제
병든 나이트가 N × M 크기 체스판의 가장 왼쪽아래 칸에 위치해 있다. 병든 나이트는 건강한 보통 체스의 나이트와 다르게 4가지로만 움직일 수 있다.
- 2칸 위로, 1칸 오른쪽
- 1칸 위로, 2칸 오른쪽
- 1칸 아래로, 2칸 오른쪽
- 2칸 아래로, 1칸 오른쪽
병든 나이트는 여행을 시작하려고 하고, 여행을 하면서 방문한 칸의 수를 최대로 하려고 한다. 병든 나이트의 이동 횟수가 4번보다 적지 않다면, 이동 방법을 모두 한 번씩 사용해야 한다. 이동 횟수가 4번보다 적은 경우(방문한 칸이 5개 미만)에는 이동 방법에 대한 제약이 없다.
체스판의 크기가 주어졌을 때, 병든 나이트가 여행에서 방문할 수 있는 칸의 최대 개수를 구해보자.
입력
첫째 줄에 체스판의 세로 길이 N와 가로 길이 M이 주어진다. N과 M은 2,000,000,000보다 작거나 같은 자연수이다.
출력
병든 나이트가 여행에서 방문할 수 있는 칸의 개수중 최댓값을 출력한다.
예시 1
예시 2
예시 3
예시 4
예시 5
분석 내용
N = 1일 때, 한 칸도 움직일 수 없으므로 이동할 수 있는 칸이 없다. 따라서, 나이트가 존재하고 있는 칸을 포함하여 방문 가능한 칸은 1개이다.
N = 2일 때, 위 아래로 한 칸씩 움직일 수 있기 때문에 2번과 3번의 방법대로 이동이 가능하다. 오른쪽으로 2칸씩 이동해야한다는 것을 생각했을 때 (M-1)//2 칸 만큼 이동이 가능하다는 것을 알 수 있고, 현재 존재하고 있는 칸의 개수를 포함해서 (M-1)//2 + 1의 칸을 방문할 수 있다.
N => 3 그리고 N < 7일 때, 오른쪽으로 한 칸씩 이동하는 경우에 최대 이동 횟수를 구할 수 있다. 이 경우 방문할 수 있는 칸의 개수는 M과 같다.
M > 7일 때, 네 가지 방법을 모두 사용해야하지만, 최대 이동 칸 수를 구하기 위해서는 1번과 4번을 반복하는 것이 좋다. 2번과 3번을 1번씩 사용했다고 생각했을 때를 구하면, M-5 + 2 + 1칸을 방문할 수 있다.
코드 구현(python 언어)
N, M = map(int, input().split()) #두 개의 정수 입력 받기
if N == 1: #N이 1일 때
count = 1
elif N == 2: #N이 2일 때
count = min(4, (M-1)//2 + 1)
elif M < 7: #N>=3 그리고 N<7 일 때
count = min(4, M)
else: #N >= 7일 때
count = M-5 + 2 + 1
print(count)
궁금한 점
1) 이동 가능 횟수가 최대 4번이 되는 이유를 모르겠다.
Author And Source
이 문제에 관하여([백준 1783 - 병든 나이트]), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@hirachel1/백준-1783-병든-나이트저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)