IT/코딩테스트

[COS Pro 1급 JAVA] 체스의 나이트 (1차 문제 6)

타미미 2025. 5. 25. 15:44

[문제]

01 COS PRO 1급 JAVA 1차

COS PRO 1급 [1차] 문제6) 체스의 나이트 - JAVA

https://edu.goorm.io/learn/lecture/17301/cos-pro-1%EA%B8%89-%EA%B8%B0%EC%B6%9C%EB%AC%B8%EC%A0%9C-java/lesson/839400/1%EC%B0%A8-%EB%AC%B8%EC%A0%9C6-%EC%B2%B4%EC%8A%A4%EC%9D%98-%EB%82%98%EC%9D%B4%ED%8A%B8-java

 

구름HOME

구름은 클라우드 기술을 이용하여 누구나 코딩을 배우고, 실력을 평가하고, 소프트웨어를 개발할 수 있는 클라우드 소프트웨어 생태계입니다.

www.goorm.io

 

 

 

 

[문제풀이]

 

- 문제 요구사항: 나이트를 한 번 움직여서 이동할 수 있는 칸의 개수

 

나이트가 움직일 수 있는 경우의 수를 적어보자.

  1. x-2, y+1
  2. x-1, y+2
  3. x+2, y+1
  4. x+1, y+2
  5. x-2, y-1
  6. x-1, y-2
  7. x+2, y-1
  8. 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 + " 입니다.");
    }
}

 

반응형