[문제]
01 COS PRO 1급 JAVA 1차
COS PRO 1급 [1차] 문제6) 체스의 나이트 - JAVA
구름HOME
구름은 클라우드 기술을 이용하여 누구나 코딩을 배우고, 실력을 평가하고, 소프트웨어를 개발할 수 있는 클라우드 소프트웨어 생태계입니다.
www.goorm.io
[문제풀이]

- 문제 요구사항: 나이트를 한 번 움직여서 이동할 수 있는 칸의 개수
나이트가 움직일 수 있는 경우의 수를 적어보자.
- x-2, y+1
- x-1, y+2
- x+2, y+1
- x+1, y+2
- x-2, y-1
- x-1, y-2
- x+2, y-1
- x+1, y-2
이 경우의 수로 계산했을 때, 체스판의 범위를 넘지 않으면 된다.
[첫번째 풀이]
import java.util.*;
class Main {
public int solution(String pos) {
int answer = 0;
char x = pos.charAt(0);
String temp = String.valueOf(pos.charAt(1));
int y = Integer.parseInt(temp) - 1;
switch(x) {
case 'A': x=0; break;
case 'B': x=1; break;
case 'C': x=2; break;
case 'D': x=3; break;
case 'E': x=4; break;
case 'F': x=5; break;
case 'G': x=6; break;
case 'H': x=7; break;
default: break;
}
if(x-2>=0 && y+1<8) answer++;
if(x-1>=0 && y+2<8) answer++;
if(x+2<8 && y+1<8) answer++;
if(x+1<8 && y+2<8) answer++;
if(x-2>=0 && y-1>=0) answer++;
if(x-1>=0 && y-2>=0) answer++;
if(x+2<8 && y-1>=0) answer++;
if(x+1<8 && y-2>=0) answer++;
return answer;
}
public static void main(String[] args) {
Main sol = new Main();
String pos = "A7";
int ret = sol.solution(pos);
System.out.println("solution 메소드의 반환 값은 " + ret + " 입니다.");
}
}
y를 배열에 넣을 때, 0부터 시작해서 계산했기 때문에 y를 뽑을때 -1 을 해주는 것을 잊지 말아야 한다.
위의 코드를 개선한 두번째 풀이도 있다!
[두번째풀이]
① x 변환할때, 아스키 코드 활용
switch문을 활용하는 대신에 아스키를 사용하여 더 쉽게 표현할 수 있다.
x 좌표 범위는 A~H 이고, 변환하고 싶은 숫자는 0~7.
| 문자 | ASCII CODE | 문자 - 'A' (문자-65) |
| A | 65 | 0 |
| B | 66 | 1 |
| C | 67 | 2 |
| D | 68 | 3 |
따라서, int x = pos.charAt(0) - 'A'; 를 사용하면 더 깔끔하다.
② 이동 범위를 배열로 관리
배열과 반복문을 사용하여 더 간결하게 구현할 수 있다.
int[][] moves = {
{-2, -1}, {-2, 1}, {-1, -2}, {-1, 2},
{1, -2}, {1, 2}, {2, -1}, {2, 1}
};
③ y 변환을 char만으로 처리
String으로 변환 후에 int로 바꾸기보다, Char만 사용하여 계산해주면 된다.
int y = pos.charAt(1) - '1';
혹은, Character.getNumericValue를 사용하는 방법도 있다.
int y = Character.getNumericValue(pos.charAt(1)) - 1;
위의 내용을 반영한 코드는 아래와 같다 😊
import java.util.*;
class Main {
public int solution(String pos) {
int answer = 0;
int x = pos.charAt(0)-'A';
int y = pos.charAt(1)-'1';
int[][] moves = {
{-2, -1}, {-2, 1}, {-1, -2}, {-1, 2},
{1, -2}, {1, 2}, {2, -1}, {2, 1}
};
for(int[] move : moves) {
int xMove = x + move[0];
int yMove = y + move[1];
if(xMove>=0 && xMove<8 && yMove>=0 && yMove<8) {
answer++;
}
}
return answer;
}
public static void main(String[] args) {
Main sol = new Main();
String pos = "A7";
int ret = sol.solution(pos);
System.out.println("solution 메소드의 반환 값은 " + ret + " 입니다.");
}
}
'IT > 코딩테스트' 카테고리의 다른 글
| [COS Pro 1급 JAVA] 합이 k 배가 되는 수 (2차 문제 4) (0) | 2025.05.25 |
|---|---|
| [COS Pro 1급 JAVA] 타임머신 (1차 문제 4) (0) | 2025.05.20 |
| [프로그래머스] 특정 문자열로 끝나는 가장 긴 부분 문자열 찾기 - java (0) | 2025.03.25 |
| [프로그래머스] 문자열 여러 번 뒤집기 - java (0) | 2025.03.18 |
| [프로그래머스] 수열과 구간 쿼리 4 - java (0) | 2025.03.17 |