[卵の仮面]体現-<2>王室の夜


💡 問題の説明


幸福王国の王室庭園はチェス盤のような8×8座標平面です.王室の庭の格子にナイトが立っています.ナイトは乗馬中なので、移動時はL字形でしか移動できず、庭の外から出られません.特定の場所から次の2つの状況に移動できます.
  • は2つの格子を水平に移動し、その後、1つの格子
  • を垂直に移動する.
  • 垂直に2つのグリッドを移動し、次に水平に1つのグリッド
  • を移動する
    このような8 x 8座標平面上でノードの位置を指定し、ノードが移動可能である場合は、プログラムを作成してその数を出力します.このとき,王室の庭における行為を表現する位置は1から8であり,表現列の位置はaからhである.

    💡 入力例

    a1
    最初の行は、現在のナイトが位置する座標(列と行からなる)を与えます.

    💡 出力例

    2

    💡 ソリューションのアイデア&私の答え


    1泊で移動できる総数が8種類なら、
    (+1,+2)(-1,+2)(+2,+1)(+2,-1)(+1,-2)(-2,+1)(-2,-1).
    現在位置で移動方向を1つずつ確認し、庭を出ない場合は、1の結果を増やせばよい.
    import java.util.Scanner;
    
    public class KnightOfKingdom {
        public static void main(String[] args) {
            // 현재 위치 좌표로 변환하기
            Scanner sc = new Scanner(System.in);
            String position = sc.next();
            int col = position.charAt(0) - 'a' + 1;
            int row = position.charAt(1) - '0';
    
            int result = 0;
    
            // 나이트가 이동할 수 있는 모든 방향
            int[] canMove_x = {1, -1, 2, 2, 1, -1, -2, -2};
            int[] canMove_y = {2, 2, 1, -1, -2, -2, 1, -1};
    
            // 모든 방향을 이동해보며 정원 밖이 아닐 경우 result 추가해주기
            for(int i=0; i<8; i++) {
                int nx = col + canMove_x[i];
                int ny = row + canMove_y[i];
    
                if(nx < 1 || ny < 1 || nx > 8 || ny > 8) {
                    continue;
                }
                else {
                    result++;
                }
            }
    
            System.out.println(result);
            sc.close();
        }
    }

    💡 サンプル回答

    import java.util.*;
    
    public class Main {
    
        public static void main(String[] args) {
            Scanner sc = new Scanner(System.in);
    
            // 현재 나이트의 위치 입력받기
            String inputData = sc.nextLine();
            int row = inputData.charAt(1) - '0';
            int column = inputData.charAt(0) - 'a' + 1;
    
            // 나이트가 이동할 수 있는 8가지 방향 정의
            int[] dx = {-2, -1, 1, 2, 2, 1, -1, -2};
            int[] dy = {-1, -2, -2, -1, 1, 2, 2, 1};
    
            // 8가지 방향에 대하여 각 위치로 이동이 가능한지 확인
            int result = 0;
            for (int i = 0; i < 8; i++) {
                // 이동하고자 하는 위치 확인
                int nextRow = row + dx[i];
                int nextColumn = column + dy[i];
                // 해당 위치로 이동이 가능하다면 카운트 증가
                if (nextRow >= 1 && nextRow <= 8 && nextColumn >= 1 && nextColumn <= 8) {
                    result += 1;
                }
            }
    
            System.out.println(result);
        }
    
    }
    *ソース:https://github.com/ndb796/python-for-coding-test