Algorithm/백준

[백준/Python] 병든 나이트

poppy 2021. 12. 2. 11:56
반응형

https://www.acmicpc.net/problem/1783

 

1783번: 병든 나이트

첫째 줄에 체스판의 세로 길이 N와 가로 길이 M이 주어진다. N과 M은 2,000,000,000보다 작거나 같은 자연수이다.

www.acmicpc.net

이 문제는 그리디 문제이다. 해결방법은 다음과 같다.

 

[ 이동 방법 ]

  1. 2칸 위로, 1칸 오른쪽
  2. 1칸 위로, 2칸 오른쪽
  3. 1칸 아래로, 2칸 오른쪽
  4. 2칸 아래로, 1칸 오른쪽

1. N == 1 인 경우

- 위 아래로 움직일 수 없으므로 시작칸만 방문할 수 있다. 따라서 방문할 수 있는 칸의 수는 1이다.

 

2. N == 2 인 경우

- 위 아래로 1칸만 움직일 수 있으므로  2, 3번 방법만으로 움직일 수 있다. 가로가 아무리 길더라도 최대 3번 이상 움직일 수 없다. (4번 이상 움직일 경우 모든 방법을 1번 이상 사용해야하기 때문!) 이동횟수는 3과 (M-1)//2 중 작은 값이 된다. 따라서 방문할 수 있는 칸 수 = 이동 횟수 + 1 이므로 4와 (M-1)//2 중 작은 값이 된다. (이동횟수 + 1인 이유는 "이동 횟수 = 이동하여 방문할 수 있는 칸수" 이고 1은 시작칸을 포함한 것이다.)

 

3. N >= 3, M <= 6 인 경우

- N >= 3이기 때문에 세로로는 자유롭게 움직일 수 있다. 하지만 최대로 이동하기 위해서는 오른쪽으로 1칸씩 이동해야 하며 최대 3번 이상 움직일 수 없다. (4번 이상 움직일 경우 모든 방법을 1번 이상 사용해야하기 때문!) 이동횟수는 3과 M-1 중 작은 값이 된다. 따라서 방문할 수 있는 칸 수는 4와 M 중 작은 값이 된다.

 

4. N >= 3, M >= 7인 경우

- 세로와 가로로 모두 자유롭게 움직일 수 있다. 최대로 이동하기 위해서는 오른쪽으로 1칸씩 이동해야 한다. 하지만 모든 방법을 1번 이상 사용해야 하므로 2, 3번 방법을 1번씩 사용하여 2번 이동하게 된다. 이동횟수는 2(2,3번 이동 횟수) + M-5(시작칸과 2,3번으로 이동한 4칸을 뺌) 이다. 따라서 방문할 수 있는 칸 수는 2 + (M-5) + 1 = M - 2 이다.

 

코드는 다음과 같이 작성할 수 있다.

N, M = map(int, input().split())

if N == 1:
    print(1)
elif N == 2:
    print(min(4, (M-1)//2+1))
elif M <= 6:
    print(min(4, M))
else:
    print(M-2)
반응형

'Algorithm > 백준' 카테고리의 다른 글

[백준/Python] 민겸 수  (0) 2021.12.13
[백준/Python] 크게 만들기  (0) 2021.12.06
[백준/Python] 공유기 설치  (0) 2021.11.29
[백준/Python] 녹색 옷 입은 애가 젤다지?  (0) 2021.11.24
[백준/Python] 스타트링크  (0) 2021.11.21