2021. 7. 6. 02:08ㆍ알고리즘/그리디
문제
https://www.acmicpc.net/problem/1783
문제 정의
병든 나이트가 N × M 크기 체스판의 가장 왼쪽아래 칸에 위치해 있다. 병든 나이트는 건강한 보통 체스의 나이트와 다르게 4가지로만 움직일 수 있다.
- 2칸 위로, 1칸 오른쪽
- 1칸 위로, 2칸 오른쪽
- 1칸 아래로, 2칸 오른쪽
- 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)
'알고리즘 > 그리디' 카테고리의 다른 글
백준 온라인 저지, 그리디 / 1092번: 배 (파이썬 / 백준 골드문제) (0) | 2021.08.29 |
---|---|
백준 온라인 저지, 그리디 / 3109번: 빵집 (파이썬 / 백준 골드문제) (0) | 2021.08.29 |
백준 온라인 저널, 그리디 알고리즘/1543번 :문서 검색(파이썬) (0) | 2021.07.06 |
백준 온라인 저널, 그리디 알고리즘/4796번 :캠핑(파이썬) (0) | 2021.07.01 |
백준 온라인 저널, 그리디 알고리즘/1449번 : 수리공 항승(파이썬) (0) | 2021.07.01 |