코딩테스트 연습 기록

이종길·2022년 1월 23일
0

코딩테스트 연습

목록 보기
55/128

2022.01.23 31일차

백준 1783번 (병든 나이트)

문제

병든 나이트가 N × M 크기 체스판의 가장 왼쪽아래 칸에 위치해 있다. 병든 나이트는 건강한 보통 체스의 나이트와 다르게 4가지로만 움직일 수 있다.

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

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

체스판의 크기가 주어졌을 때, 병든 나이트가 여행에서 방문할 수 있는 칸의 최대 개수를 구해보자.

나의 풀이

  1. 무조건 오른쪽으로 1번 or 2번 이동, N이 3이상이면 조건에 영향x
  2. 나이트 위치 x, y로 가정
  3. N or M이 1이면 이동x
  4. N == 2이면 y는 오로지 2씩 증가
  5. N이 제한되면서 이동 횟수는 1 ~ 4번, 4번이 아닐 때는 M이 1, 3, 5, 7, ...일 때 횟수 증가 - (1 + M) / 2
  6. 4 or 조건에 따른 최소값 출력
  7. M <= 6일 때 최대 이동 횟수는 4번이면서 M만큼 이동 가능
  8. 나머지 경우에는 M - 2가 최대 이동 횟수(y가 2번 이동이 2번 발생, 나머지는 y가 1번 이동)
import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        int N = scanner.nextInt();
        int M = scanner.nextInt();

        int count;

        if (N == 1 || M == 1) {
            count = 1;
        } else if (N == 2) {
            count = Math.min(4, (1 + M)/2);
        } else if (M <= 6) {
            count = Math.min(4, M);
        } else {
            count = M - 2;
        }

        System.out.println(count);
    }
}

생각하기

  • N == 1 || M == 1 불필요, N == 1 만 살펴봐도 무관
  • Math.min을 사용하면서 조건을 구분
profile
Go High

0개의 댓글

관련 채용 정보