문제
- 행복 왕국의 왕실 정원은 체스판과 같은 8 X 8 좌표 평면입니다. 왕실 정원의 특정한 한 칸에 나이트가 서 있습니다.
- 나이트는 말을 타고 있기 때문에 이동을 할 때는 L자 형태로만 이동할 수 있으며 정원 밖으로는 나갈 수 없습니다.
- 나이트는 특정 위치에서 다음과 같은 2가지 경우로 이동할 수 있습니다.
1. 수평으로 두 칸 이동한 뒤에 수직으로 한 칸 이동하기
2. 수직으로 두 칸 이동한 뒤에 수평으로 한 칸 이동하기
- 이처럼 8 X 8 좌표 평면상에서 나이트의 위치가 주어졌을 때 나이트가 이동할 수 있는 경우의 수를 출력하는 프로그램을 작성하세요. 왕실의 정원에서 행 위치를 표현할 때는 1부터 8로 표현하며 열 위치를 표현할때는 a부터 h로 표현합니다.
입력 -> 출력
c2 -> 6
a1 -> 2
문제해결
1) 내 풀이
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String input = sc.next();
//현재 위치 좌표로 변환 c2 -> (2,3)
int x = input.charAt(1)-'0';
int y = 0;
switch(input.charAt(0)) {
case 'a': y=1; break;
case 'b': y=2; break;
case 'c': y=3; break;
case 'd': y=4; break;
case 'e': y=5; break;
case 'f': y=6; break;
case 'g': y=7; break;
case 'h': y=8; break;
}
int cnt = 0;
//말이 움직일 수 있는 모든 경우에수 8가지
if(y-2>=1) {
if(x-1>=1) cnt++;
if(x+1<=8) cnt++;
}
if(x-2>=1) {
if(y-1>=1) cnt++;
if(y+1<=8) cnt++;
}
if(y+2<=8) {
if(x-1>=1) cnt++;
if(x+1<=8) cnt++;
}
if(x+2<=8) {
if(y-1>=1) cnt++;
if(y+1<=8) cnt++;
}
System.out.println(cnt);
}
2) 정답
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String input = sc.next();
//현재 위치 좌표로 변환 c2 -> (2,3)
int x = input.charAt(1)-'0';
int y = input.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 cnt = 0;
for(int i=0;i<8;i++) {
//이동하고자 하는 위치 확인
int nextRow = x + dx[i];
int nextCol = y + dy[i];
//해당 위치로 이동이 가능하다면 카운트 증가
if(nextRow>=1 && nextRow<=8 && nextCol>=1 && nextCol<=8)
cnt++;
}
System.out.println(cnt);
}
- 영문자를 숫자로 표현하는건 이렇게 간단하게 할 수 있었다... 메모...
int y = input.charAt(0)-'a'+1;
- 말이 움직일 수 있는 8가지를 구하는건데, 배열 dx,dy로 방향 백터를 만드는게 더 복잡할 거 같아서 전부 if문으로 구현했는데, 정답을 보고 나니 방향 백터를 만드는게 생각보다 복잡하지 않았다, 나중에 더 어려운 문제에서는 방향 백터를 사용해봐야겠다
'[알고리즘] > 이코테' 카테고리의 다른 글
다이나믹 프로그래밍 - 피보나치 수열 (0) | 2021.07.11 |
---|---|
구현 - 문자열 재정렬 (0) | 2021.02.24 |
구현 - 시각 (0) | 2021.02.20 |
구현 - 상하좌우 (0) | 2021.02.19 |
그리디 - 모험가 길드 (0) | 2021.02.18 |