PS/BOJ2022. 5. 8. 14:04

병든 나이트 : https://www.acmicpc.net/problem/1783

 

제약 조건: 

병든 나이트는 여행을 시작하려고 하고, 여행을 하면서 방문한 칸의 수를 최대로 하려고 한다. 
병든 나이트의 이동 횟수가 4번보다 적지 않다면, 이동 방법을 모두 한 번씩 사용해야 한다. 
이동 횟수가 4번보다 적은 경우(방문한 칸이 5개 미만)에는 이동 방법에 대한 제약이 없다.

 

조건을 쓴 사람의 설명이 부족한건지 이해하지 못한 내가 멍청한 건지..

이동 방법에 제약이 없다는 말의 의미를 해석할 때, 머리가 터질것 같았다.

 

처음엔 이동방법에 제약이 없다는 말을 4방향 +1칸씩 이동가능하며 이를 횟수로 4번 가능하다 라고 해석해서 실패했다.

아무리 예시에 대입해도 답이 나오지 않음.

 

참조 : https://data-make.tistory.com/653

 

위의 사이트를 참조하고 나서 겨우 의미가 이해가 되었고 문제가 해결됐다.

말의 움직임은 문제에 주어진 대로만 가능하며 이동방법에 제약이 없다는 것은 제시된 움직 중 각각의 동작을 4번까지 할 수 있다는 것이다.

 

이 조건을 이해하면 그림만 그려보면 답이 나온다.

 

 

다소 오류가 있으나 알아볼 수는 있다

 

#N=1

말이 행동할 수 있는 경우 없음. 

#N=2

2칸 증가할 때마다 행동이 하나씩 늘어남. 

1,1

2,1

3,2

4,2

5,3,

6,3

7,4

8,4

9,4

 

4회 이동까지만 허용되므로 m이 홀수인 경우 몫이 반올림 되지 않으므로 +1을 해준 뒤 몫을 취한다. 

answer = min ( 4, (m+1)/2) 가 된다.

 

 

#N=3

M 1한칸당 1개씩 늘어난다. 

M < 7 인 경우, N=2와 같은 이유로 4개가 최대가 되며 M=7을 기점으로 M 한칸당 1개씩 증가한다.

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.math.BigInteger;
import java.util.*;

public class Main {

	static int N, M;
	static boolean DBG = false;

	public static void main(String[] args) throws IOException {

		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		StringTokenizer st = new StringTokenizer(br.readLine());

		N = Integer.parseInt(st.nextToken());
		M = Integer.parseInt(st.nextToken());

		int answer = 1;
		if( N == 1)
			answer = 1;
		else if (N == 2)
			answer = Math.min(4, (M+1)/2);
		else if (M  < 7 ) {
			answer = Math.min(4, M);
		} else {
			answer = 5 + (M-7);
		}
		
		System.out.println(answer);

	}

}

 

 

'PS > BOJ' 카테고리의 다른 글

2873  (0) 2022.05.10
1931  (0) 2022.05.08
10610  (0) 2022.05.08
2875  (0) 2022.05.07
11662 (삼분탐색 ternary search)  (0) 2022.05.07
Posted by easy16