티스토리 뷰

💻JAVA 코드 바로보기

 

 

 

 

문제 설명

체스에서 나이트(knight)는 아래 그림과 같이 동그라미로 표시된 8개의 방향중 한 곳으로 한 번에 이동이 가능합니다.

image

단, 나이트는 체스판 밖으로는 이동할 수 없습니다. 체스판의 각 칸의 위치는 다음과 같이 표기합니다.

image


예를 들어, A번줄과 1번줄이 겹치는 부분은 'A1'이라고 합니다.

나이트의 위치 pos가 매개변수로 주어질 때, 나이트를 한 번 움직여서 이동할 수 있는 칸은 몇개인지 return 하도록 solution 메소드를 완성해주세요.


매개변수 설명

나이트의 위치 pos가 solution 메소드의 매개변수로 주어집니다.

  • pos는 A부터 H까지의 대문자 알파벳 하나와 1 이상 8이하의 정수 하나로 이루어진 두 글자 문자열입니다.
  • 잘못된 위치가 주어지는 경우는 없습니다.

return 값 설명

나이트를 한 번 움직여서 이동할 수 있는 칸의 개수를 return 해주세요.


예시
pos return
"A7" 3
 
예시 설명

나이트가 A7 위치에 있으면 아래 그림과 같이 왼쪽으로는 이동하지 못하고, 오른쪽으로는 맨 위를 제외한 나머지 세 칸으로 이동 가능합니다.

image


따라서, 3을 return 하면 됩니다.

 

 

 


 

 

 

 

 

완성 코드

package Set01;

class Q3 {
    public int solution(String pos) {
        //이동할 수 있는 칸 count
        int answer = 0;

        // 나이트의 좌표를 x,y라고 할때 이동가능한 좌표를 표시하면
        // (x-1,y+2), (x-2,y+1), (x-2,y-1), (x-1,y-2),
        // (x+1,y-2), (x+2,y-1), (x+2,y+1), (x+1,y+2)

        //나이트 위치 변환
        int x = pos.charAt(0)-'A';
        int y = pos.charAt(1)-'1';

        //x좌표와 y좌표의 이동값을 담아놓은 배열
        int[][] moved = {{-1,2},{-2,1},{-2,-1},{-1,-2},{1,-2},{2,-1},{2,1},{1,2}};

        for(int i=0;i<moved.length;i++){
            if(x+moved[i][0]>-1 && x+moved[i][0]<8 && y+moved[i][1]>-1 && y+moved[i][1]<8)
                answer++;
        }

        return answer;
    }

    // The following is main method to output testcase.
    public static void main(String[] args) {
        Q3 sol = new Q3();
        String pos = "A7";
        int ret = sol.solution(pos);

        // Press Run button to receive output.
        System.out.println("Solution: return value of the method is " + ret + " .");
    }
}

 

 

코드 분석

 

체스판의 크기는 8x8로 고정되어있기 때문에,

움직인 말(knight)의 위치가 x좌표 0-7, y좌표 0-7 내부에 존재하면 answer의 값을 증가시키면 된다.

이때 나이트가 움직일 수 있는 경우의 수는 최대 8개로 아래와 같다.

(x-1,y+2), (x-2,y+1), (x-2,y-1), (x-1,y-2),
(x+1,y-2), (x+2,y-1), (x+2,y+1), (x+1,y+2)

좀 더 단순한 계산을 위해 x와 y값의 움직임을 각 경우의 수에 맞추어 배열에 넣었다.

 

따라서 주어진 나이트의 위치를 int형으로 변환시키고, 8번 반복하여 각 좌표가 체스판 내부에 있는지 

if(x+moved[i][0]>-1 && x+moved[i][0]<8 && y+moved[i][1]>-1 && y+moved[i][1]<8)

를 통해 확인한다.

 

 

 

 

YBM 제공 코드

class Solution {
    public int solution(String pos) {
    	int dx[] = {1,1,-1,-1,2,2,-2,-2};
    	int dy[] = {2,-2,-2,2,1,-1,-1,1};
    	int cx = pos.charAt(0) - 'A';
    	int cy = pos.charAt(1) - '0' - 1;
    	int ans = 0;
    	for (int i = 0; i < 8; ++i) {
    		int nx = cx + dx[i];
    		int ny = cy + dy[i];
    		if (nx >= 0 && nx < 8 && ny >= 0 && ny < 8)
    			ans++;
    	}
    	return ans;
    }

    // 아래는 테스트케이스 출력을 해보기 위한 main 함수입니다.
    public static void main(String[] args) {
    	Solution sol = new Solution();
	    String ex0_pos = "A7";
	    int ex0_ret = sol.solution(ex0_pos);
    	
        // [실행] 버튼을 누르면 출력 값을 볼 수 있습니다.
        System.out.printf("첫 번째 예제의 답은 %d 입니다.\n", 3);
        System.out.printf("solution 함수의 반환 값은 %d 입니다.\n", ex0_ret);
    }
}
위 코드에서 각 말이 움직인 값을 2차원 배열이 아닌 1차원 배열으로(x와 y값을 따로) 넣었다는 것을 제외하면 풀이방법은 동일하다.

 

 

 

 

 

 

 

 

 

 

 

 

KimSky904 - Overview

Department of New Media Software. KimSky904 has 27 repositories available. Follow their code on GitHub.

github.com

 

 

 

댓글