ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [구현] 문제 이름 : 왕실의 나이트
    Algorithm/유형별 문제 풀기 2021. 6. 29. 12:10

    문제 설명

    8 x 8 좌표 평면이 있고, 나이트는 이동 할 때 L자 형태로만 이동이 가능하다. 나이트는 특정한 위치에서 다음과 같은 2가지 경우로 이동할 수 있다.

    1. 수평을 2칸 이동한 뒤에 수직으로 1칸 이동하기

    2. 수직으로 2칸 이동한 뒤에 수평으로 1칸 이동하기 

    이처럼 8 x 8 좌표 평면 상에서 나이트의 위치가 주어졌을 때 나이트가 이동할 수 있는 경우의 수를 출력하는 프로그램 작성하기 

    (행 위치 표현은 1~8, 열 위치 표현은 a~h)

     

    1. 사용 알고리즘

    구현 - 모든 경우의 수 탐색

     

    2. 문제 해결 아이디어 

    나이트가 좌표 평면에서 상하좌우로 이동 가능한 모든 경우의 수에 대해 행과 열 각각의 이동 거리를 저장해둔다. 주어진 나이트의 위치를 바탕으로 모든 이동 가능 경우에 대해 좌표 값을 계산하고, 좌표를 벗어나지 않는 경우에 대해서 찾으면 된다. 

     

    3. 코드

    구현 방식)

    움직일 수 있는 경우에 대해 각각의 row와 col 이동 거리를 2개의 배열의 동일한 Index 위치에 저장한다. -> 형태 잘 기억해두기!

    모든 경우에 대해 확인하며 이동 후의 좌표 평면 위치를 계산해 범위를 벗어난 경우 전체 경우의 수에서 빼준다. 

    import java.util.Scanner;
    
    public class q1 {
    
    	public static void main(String[] args) {
    		Scanner kbd = new Scanner(System.in);
    		//움직일 수 있는 경우의 수 : 8가지 
    		int	dx[] = {2, 2, -2, -2, 1, -1, 1, -1}; //row에 대해 이동할 수 있는 경로 
    		int	dy[] = {1, -1, 1, -1, 2, 2, -2, -2}; //col에 대해 이동할 수 있는 경로 
    		
            //나이트의 좌표 평면 상 위치 입력 
    		String inputData = kbd.nextLine();
    		int col = inputData.charAt(0) - 'a' + 1; //문자로 주어진 좌표를 int로 변환하기 : char to int
    		int row = inputData.charAt(1) - '0';
    		
    		int cnt = 8; //전체 경우의 수 
    		
    		for(int i = 0; i < dx.length; i++) {
    			int col_y = col + dy[i];
    			int row_x = row + dx[i];
    			
    			if(col_y < 1 || col_y > 8 || row_x < 1 || row_x > 8) //조건을 만족하지 않을 때 : 좌표의 범위를 벗어났을 때 
    				cnt--;
    		}
    		
    		System.out.println(cnt);
    	}
    
    }

     

    추가로 개념 정리)

    *String -> char -> int

    1. Scanner 클래스의 nextLine()으로 String 입력 

    2. String 클래스의 charAt(int index)로 특정 index의 String을 char로 형변환

    3. char값 - '0' 으로 입력한 숫자 획득 가능

    char(0~9)는 아스키 코드 48부터 시작함 -> '0' = 48, '1' = 49 . . .

    숫자 char - '0'을 통해 입력한 숫자를 얻을 수 있음 

    댓글

Designed by Tistory.