개발하는 삶
[백준] 1783 본문
나중에 또 풀어보자!
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보다 작거나 같은 자연수이다.
출력
병든 나이트가 여행에서 방문할 수 있는 칸의 개수중 최댓값을 출력한다.
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)
'CS > 알고리즘' 카테고리의 다른 글
[알고리즘] 그리디 알고리즘 (0) | 2022.06.24 |
---|---|
[백준] 11000 (0) | 2022.06.22 |
[알고리즘] 용어, 우선순위 큐, 트리 (0) | 2022.06.20 |
[에러 메모] SyntaxError: invalid syntax (0) | 2022.06.19 |
[에러 메모] TypeError: '(map/str...)' object cannot be interpreted as an integer (0) | 2022.06.19 |