백준 1783: 병든 나이트(Java)

1 minute read

문제링크 : https://www.acmicpc.net/problem/1783

문제

img1

문제를 해결한 방법

입력값이 엄청나게 크기 때문에 BFS로 접근하면 시간초과납니다…

저는 처음에 문제를 보고 종이에 몇가지 케이스를 그려보니 규칙이 보였습니다.

1) N이 1인 경우

img1

  • 아무방향으로도 움직일 수 없어서 count는 1

2) N이 2인 경우

img2

  • 2,3번 방향으로만 움직일 수 있어서 count는 (M+1)/2
  • 네방향 다 움직일 수 없어서 총 3번까지만 움직임(max = 4, 시작지점 포함)

3) N이 3 이상일 경우

img3

  • M < 7

  • 1,4번 방향을 번갈아가며 움직이면 count는 M

  • 네방향 다 움직일 수 없어서 총 3번까지만 움직임(max=4)

    img4

  • M >= 7

  • M이 7일 때 네방향 모두 움직일 수 있음
  • 그 이후에는 1,4번 방향을 번갈아가며 움직이면 count는 M-2

소스 코드

package baek;

import java.io.*;
import java.util.*;

public class Main_1783_병든나이트 {
	
/*
	1) 2칸 위로, 1칸 오른쪽
	2) 1칸 위로, 2칸 오른쪽
	3) 1칸 아래로, 2칸 오른쪽
	4) 2칸 아래로, 1칸 오른쪽
*/
    public static void main(String[] args) throws Exception{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        
        int N = Integer.parseInt(st.nextToken());
        int M = Integer.parseInt(st.nextToken());
        
        int result = 0;
        
        if(N == 1) {
            // N이 1이면 이동 불가 (시작지점만)
            result = 1;
		}else if(N == 2) {
            // N이 2일 떈, 2번,3번 방향으로만 움직일 수 있음
            // 절대 4방향 다 움직일 수 없어서 최댓값은 4
            result = Math.min((M+1)/2, 4);
		}
        else if(N>=3){
            // M=7 부터 4방향 다 이동 가능
            // 4방향 다 이동한 후에는 y값이 1씩 증가하는 1번,4번 이동을 반복
            // 즉, M-2개의 칸을 갈 수 있음
			if(M < 7) {
				result = Math.min(M, 4);
			}else {
				result = M-2;
			}
		}
		
		System.out.println(result);
	}
}

Categories:

Updated:

Comments