본문 바로가기

알고리즘(w.KOTLIN)/그리디(Greedy)

[백준][코틀린][1783] 병든 나이트

728x90

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

 

1783번: 병든 나이트

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

www.acmicpc.net

문제 풀이

1. 병든 나이트의 이동 조건을 보면 오른쪽으로만 무조건 이동이 가능하고 이동 횟수가 아무리 많아도 4가지의 이동 조건을 만족 시키지 못하면 최대 횟수는 3이 된다.

2. 세로의 경우에 대해서 아래와 같이 최대 이동 회수를 확인 한다.

- 세로가 1일 경우 : 위아래 이동이 불가능하므로 최대 이동 회수는 0이므로 방문 칸은 처음 위치만 포함된 1이 된다.

O        

- 세로가 2일 경우

1. 가로가 3일 경우 1회 방문 가능하다.

2. 가로가 5일 경우 2회 방문 가능하다.

3. 가로가 7일 경우 3회 방문가능하다.

4. 이후 가로 길이에 대해서 방문 회수가 4회 이상이므로 모든 이동 조건을 사용해야 하지만 조건을 만족하지 못하므로 최대 방문 회수는 3이 된다.

    1       3
O       2    

- 세로가 3이상일 경우

1. 가로가 6이하일 경우 가로 길이에 따라 최대 회수를 구한다.

2. 가로가 7이상일 경우 모든 이동 조건을 수행할 수 있다. 따라서 최대 회수는 4가 된다.

3. 이후 가로가 들어 날때 마다 1번, 4번 이동 조건을 반복하면서 방문 칸의 회수를 증가 시킨다.

즉 4 + (M - 7)이 최대 회수가 된다.

  1          
        3    
O   2       4

코드

import java.io.*

fun main(args: Array<String>) {
    val br = BufferedReader(InputStreamReader(System.`in`))
    // N : 세로
    // M : 가로
    val (N, M) = br.readLine().split(" ").map { it.toInt() }


    val result = when (N) {
        1 -> 1
        2 -> {
            when (M) {
                in 1..2 -> 1
                in 3..4 -> 2
                in 5..6 -> 3
                else -> 4
            }
        }
        else -> {
            when (M) {
                1 -> 1
                2 -> 2
                3 -> 3
                in 4..6 -> 4
                else -> 5 + (M - 7)
            }
        }
    }

    println(result)
}
728x90