https://www.acmicpc.net/problem/1783
1783번: 병든 나이트
첫째 줄에 체스판의 세로 길이 N와 가로 길이 M이 주어진다. N과 M은 2,000,000,000보다 작거나 같은 자연수이다.
www.acmicpc.net
문제
병든 나이트가 N × M 크기 체스판의 가장 왼쪽아래 칸에 위치해 있다. 병든 나이트는 건강한 보통 체스의 나이트와 다르게 4가지로만 움직일 수 있다.
- 2칸 위로, 1칸 오른쪽
- 1칸 위로, 2칸 오른쪽
- 1칸 아래로, 2칸 오른쪽
- 2칸 아래로, 1칸 오른쪽
병든 나이트는 여행을 시작하려고 하고, 여행을 하면서 방문한 칸의 수를 최대로 하려고 한다. 병든 나이트의 이동 횟수가 4번보다 적지 않다면, 이동 방법을 모두 한 번씩 사용해야 한다. 이동 횟수가 4번보다 적은 경우(방문한 칸이 5개 미만)에는 이동 방법에 대한 제약이 없다.
체스판의 크기가 주어졌을 때, 병든 나이트가 여행에서 방문할 수 있는 칸의 최대 개수를 구해보자.
입력
첫째 줄에 체스판의 세로 길이 N와 가로 길이 M이 주어진다. N과 M은 2,000,000,000보다 작거나 같은 자연수이다.
출력
병든 나이트가 여행에서 방문할 수 있는 칸의 개수중 최댓값을 출력한다.
내 풀이
# 31120kb 40ms
모든 케이스에 대해 하나씩 if문으로 확인하며 진행하였다.
n, m = map(int, input().split())
if n > 2:
if m > 5: # 오른쪽이 더 적게 가야할 경우 : 최소 위로 2칸은 있어야 함
res = m - 6 + 4 # 최소조건 -6칸+4번 / 나머지 칸 = 횟수
print(res)
elif m == 5: # 최소조건 불가능 = 결과가 5이상 나오면 안됨
print(4)
elif m < 5: # 그 외에는 m칸 = m번
print(m)
elif n == 2: # 위로 1칸 밖에 못움직여서 오른쪽을 무조건 2칸씩
if m % 2 == 1:
res = m//2+1
else:
res = m//2
if res > 4:
print(4)
else:
print(res)
elif n == 1:
print(1) # 처음 칸 밖에 안됨
물론 더 숏코딩도 가능하다.
n, m = map(int, input().split())
if n == 1:
answer = 1
elif n == 2:
answer = min(4, (m+1)//2)
else:
if m <= 6:
answer = min(4, m)
else:
answer = m-2
print(answer)
메모
그리디 알고리즘
'파이썬 알고리즘 연습' 카테고리의 다른 글
[Python | 프로그래머스] 주차 요금 계산 (0) | 2024.06.11 |
---|---|
[Python | 프로그래머스] 가장 많이 받은 선물 (1) | 2024.06.11 |
[Python | 백준 11478번] 서로 다른 부분 문자열의 개수 (0) | 2024.04.23 |
[Python | 백준 1515번] 수 이어 쓰기 (0) | 2024.04.23 |
[Python | 백준 1431번] 시리얼 번호 (0) | 2024.04.23 |