사용언어 : 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);
}
'알고리즘 > 코딩테스트' 카테고리의 다른 글
[이것이 코딩테스트다] 그리디, 문자열 뒤집기 JAVA 자바풀이 (0) | 2022.06.26 |
---|---|
[이것이 코딩테스트다] 탐색, 얼음 얼려먹기 JAVA 자바풀이 (0) | 2022.06.19 |
[이것이 코딩테스트다] 그리디, 곱하기 혹은 더하기 JAVA 풀이 (0) | 2022.05.21 |
[이것이 코딩테스트다] 그리디, 모험가길드 JAVA풀이 (0) | 2022.05.21 |
[백준 1427] 소트인사이드 JAVA 풀이 (0) | 2022.03.06 |