백준 온라인 저널, 그리디 알고리즘/1783번: 병든 나이트(파이썬)

2021. 7. 6. 02:08알고리즘/그리디

728x90
반응형

문제

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

 

 

 

출력

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

 

 

 

예제 입력 1

100 50

 

예제 출력 1

48

 

예제 입력 2

1 1

 

예제 출력 2

1

 

 

접근 방법 

- 이동 횟수가 4번보다 적은 경우는 따로 계산한다. 
1. n >= 3 and m < 5 인 경우 : m
2-1. n == 2 and m < 9 인 경우 : m//2 + 1
2-2. n == 2 and m >= 0 인 경우 : 4
3. 위의 조건이 모두 아니고, n == 1 or m == 1인 경우 : 1
4. 위의 조건이 모두 아니고, m < 7 인 경우 : 4

- 이동 횟수가 4번보다 높은 경우는 모두 한번씩 사용한 위치부터 가정한 뒤,(가로 좌표 : 7) 가로의 길이 - 7만큼 여태 이동한 칸 수를 모두 더해준다.

 

코드

# 접근방법
# 이동 횟수가 4번보다 적은 경우는 따로 계산한다. 
# 1. n >= 3 and m < 5 인 경우 : m
# 2-1. n == 2 and m < 9 인 경우 : m//2 + 1
# 2-2. n == 2 and m >= 0 인 경우 : 4
# 3. 위의 조건이 모두 아니고, n == 1 or m == 1인 경우 : 1
# 4. 위의 조건이 모두 아니고, m < 7 인 경우 : 4

# 이동 횟수가 4번보다 높은 경우는 모두 한번씩 사용한 위치부터 가정한 뒤,(가로 좌표 : 7) 가로의 길이 - 7만큼 여태 이동한 칸 수를 모두 더해준다.

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

if n >= 3 and m < 5:
    print(m)
elif n == 2:
    if m < 9:
        print(m//2 + m%2)
    else:
        print(4)
elif n == 1 or m == 1:
    print(1)

elif m < 7: # n은 1, 2가 아니고 m은 5보다 크기때문에 m < 7일 때 4를 출력한다.
    print(4)

else:
    print(5+m-7)
728x90
반응형