개발하는 삶

[백준] 1783 본문

CS/알고리즘

[백준] 1783

삶_ 2022. 6. 20. 20:06

나중에 또 풀어보자!

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보다 작거나 같은 자연수이다.

출력

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

 

n,m = map(int, input().split())

# 방문한 도착 칸 수(횟수)를 구하는 것임
# 4가지 방법들을 선택한 횟수구하기
#최적을 구하는거니까 오차를 줄일수있는 세로길이 기준으로하기 (가로는 계속 늘릴거라 어쩔수없음)
#세로로 먼저 이동하는 것이기 때문에 세로를 기준으로 작성하기
#n이 1이면 움직일수없어서 본인 칸만 존재.
if n == 1:
    print(1)
elif n == 2:
    # 2번3번 번갈아가며 사용한다 (위로1칸+아래1칸)
    # m이 1,2 일때 결과는 1 그 둘중에 최솟값을 구하면 됨
    # 어떻게든 나눴을때 1,2,3,4.. 가 나오도록 +1해서 2로 몫을 구함
    print(min(4, (m+1)//2)) #(m+1)//2= 4가되는 m이 나올때까지 최솟값으로!
else:
    if m <= 6:
        print(min(4, m))
        #일일이 그림으로 그려가면서 봐야 알수있음
        #4번째때 3회이동이므로 최솟값이 3이 나오니까. 그 외는 다 4
    else:
        print(m-2)