코딩테스트/코딩테스트

[이것이 코딩테스트다] 구현, 왕실의 나이트 JAVA 구현

90만식 2022. 6. 14. 22:11
728x90
사용언어 : JAVA
출처 : 이것이 코딩테스트다(115Page)
난이도 :  쉬움
풀이시간 : 20분
1.문제

 행복 왕국의 왕실 정원은 체스판과 같은 8 X 8 좌표 평면이다.

나이트는 말을 타고 있기 때문에 이동 할 때는 L자 형태로만 이동할 수 있으며 정원 밖으로는 나갈 수 없다.

나이트는 특정한 위치에서 다음과 같은 2가지 경우로 이동할 수 있다.

 

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

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

 

 

 * 책에 나온건 소문자 알파벳임

 

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

이때 왕실의 정원에서 행 위치를 표현할 때는 1~8로 표현하며, 열 위치를 표현할 때는 a~h로 표현한다.

 

만약 나이트가  a1에 있다면 경우의 수는 2가지이다. a1의; 위치는 좌표 평면에서 구석에 위치에 해당하며 나이트는 정원 밖으로는 나갈 수 없기 때문이다.

 

1. 오른쪽(열)으로 두 칸 이동 후  아래로(행) 한 칸 이동하기 (c2)

2. 아래(행)로 두 칸 이동 후 오른쪽(열)으로 한 칸 이동하기(b3)

2.입력

- 첫째 줄에 8 X 8 좌표 평면상에서 현재 나이트가 위치한 곳의 좌표를 나타내는 두 문자로 구성된 문자열이 입력된다.

입력 문자는 a1처럼 열과 행으로 이뤄진다.

 

3.출력

 

- 첫째 줄에 나이트가 이동할 수 있는 경우의 수를 출력하시오

#입력 예시
a1

#출력 예시
2

 

 

2.코드구현(JAVA)

 

 나는 아래와 같은 방법으로 문제를 해결 했다.

 

 1. 나이트가 이동 가능한 경로를 2차원 배열에 저장한다.

 2. 키보드로 행,열을 입력받아 이동 가능한 경로를 더한다.

 3. 키보드로 입력받은 행+이동경로의 행, 로우+이동경로의 로우 값이 -1 이상이거나 8 이상이면 8 X 8 좌표 평면을 벗어난 것이기 때문에 이동 가능 경로로 치지 않는다.

 4. 3번을 제외한 이동경로를 가능한 이동 경로라고 판단한다.

 

자바로 구현한 코드는 아래와 같다.

 

public static void main(String[] args) {
		
		Scanner sc = new Scanner(System.in);
		
		// 나이트 이동 가능 경로
		int[][] POSSIBLE_MOVE = {{1,2}, {-1,2}, {1,-2}, {-1,-2}, {2,1}, {2,-1}, {-2,1}, {-2,-1}};
		
		// 이동가능한 경우의 수
		int possibleCnt = 0;
	
		char[] InCharArray = sc.next().toCharArray();		// 키보드로 입력 받은 문자열 char형 Array로 변경
		int row = InCharArray[0]-'a';						// 입력받는 a~h를 배열의 인덱스로 변경
		int column = InCharArray[1]-'1';					// 입력받은 숫자 0부터 시작하게 변경
		
		for(int i=0; i<POSSIBLE_MOVE.length; i++) {			// 이동가능한 경로만큼 비교
			
			int row_sum = row+POSSIBLE_MOVE[i][0];			
			int column_sum = column+POSSIBLE_MOVE[i][1];
			
			if(row_sum > -1 && row_sum < 8 &&  column_sum > -1 && column_sum < 8 ) {
				possibleCnt++;
			}
			
		}
		
		System.out.println("possibleCnt : " + possibleCnt);

	}

 

728x90