자바 이것이 코딩 테스트다 - chapter04 - 2 왕실의 나이트
문제
행복 왕국의 왕실 정원은 체스판과 같은 8 × 8 좌표 평면이다. 왕실 정원의 특정한 한 칸에 나이트가 서있다. 나이트는 매우 충성스러운 신하로서 매일 무술을 연마한다. 나이트는 말을 타고 있기 때문에 이동을 할 때는 L자 형태로만 이동할 수 있으며 정원 밖으로는 나갈 수 없다. 나이트는 특정 위치에서 다음과 같은 2가지 경우로 이동할 수 있다.
- 수평으로 두 칸 이동한 뒤에 수직으로 한 칸 이동하기
- 수직으로 두 칸 이동한 뒤에 수평으로 한 칸 이동하기
이처럼 8 × 8 좌표 평면상에서 나이트의 위치가 주어졌을 때 나이트가 이동할 수 있는 경우의 수를 출력하는 프로그램을 작성하라. 왕실의 정원에서 행 위치를 표현할 때는 1부터 8로 표현하며, 열 위치를 표현할 때는 a 부터 h로 표현한다
예를 들어 만약 나이트가 a1에 있을 때 이동할 수 있는 경우의 수는 다음과 같은 2가지이다. a1의 위치는 좌표 평면에서 구석의 위치에 해당하며 나이트는 정원의 밖으로는 나갈 수 없기 때문이다.
오른쪽으로는 두 칸 이동 후 아래로 한 칸 이동하기 (c2)
아래로 두 칸 이동 후 오른쪽으로 한 칸 이동하기 (b3)
또 다른 예로 나이트가 c2에 위치해 있다면 나이트가 이동할 수 있는 경우의 수는 6가지이다. 이건 직접 계산해보시오.
생각
1.L자로 움직일 수 있는 방법은 총 8가지이다. 해당 8가지의 경우 수에대한 x,y를 배열에 저장한다.
2. 좌표가 주어졌을때 계산하기 쉽게 a~h도 1~8로 변환하여 8가지 경우의 수에 대해 계산한다.
코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StringReader;
public class Main{
//4챕터구현 2번 왕실의 나이트
public static void main(String[] args) throws IOException{
BufferedReader bf= new BufferedReader(new InputStreamReader(System.in));
String str = bf.readLine();
int x = str.charAt(1)-'0'; //x,y로 변환
int y = str.charAt(0)-'a'+1;
int Ox = x;
int Oy = y;
int[] dx = {-2,-2,-1,1,-1,1,2,2}; //L자로 움직일 수 있는 x,y좌표 설정
int[] dy = {-1,1,-2,-2,2,2,-1,1};
int count=0;
for(int i=0 ; i<8;i++) {
Ox += dx[i];
Oy += dy[i];
if(Ox<1 || Ox>8 || Oy<1 || Oy >8 ) { //정답예제는 밖으로 나가는처리가 아니라 안에들어오는처리 ex)Ox>=1와 같이.
Ox =x;
Oy =y;
continue;
}
Ox =x;
Oy =y;
count ++;
}
System.out.println(count);
}
}
'알고리즘 > 구현' 카테고리의 다른 글
자바 이것이 코딩 테스트다 - chapter04 - 3 게임 개발 (1) | 2024.10.13 |
---|---|
이것이 코딩 테스트다 - chapter04 - 예제4-2 시각 , 백준 자바 18312 시각 (1) | 2024.10.12 |
이것이 코딩 테스트다 - chapter04 - 예제4-1 상하좌우 (0) | 2024.10.12 |
자바알고리즘 - 구현 - 자물쇠와 열쇠 (0) | 2024.02.02 |
자바알고리즘 - 구현 - 문자열 압축 (0) | 2024.01.29 |