본문 바로가기
Programming/Cos Pro 1급

Cos Pro 1급 - 샘플 문제 풀이 1차 3번 (Ascii 코드 활용)

by 우공80 2022. 10. 5.
728x90

체스-나이트 이동 가능 칸 수 구하기

문제 지문 #3


체스에서 나이트(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 하면 됩니다.

 

혼자 풀이


소용돌이 문제와 비슷해서 금방 풀었습니다.
일단 체스판의 좌표가 배열과 다르기 때문에 Ascii 코드를 직접 계산해서 배열의 index로 변경해주었습니다.
8가지 패턴을 배열로 만들었고, for 문을 돌면서 각 위치가 체스판 안에 있다면 answer를 증가시키고, 체스판 밖에 있다면 answer를 그대로 두었습니다.

/******************************************
  1차 3번 체스-나이트 이동가능 칸 수 구하기
 *****************************************/

class MySolution {

    boolean inRange(int i, int j){
        return (0 <= i && i < 8) && (0 <= j && j < 8);
    }
    public int solution(String pos) {
        // Write code here.
        int answer = 0;

        //Ascii 코드값으로 계산해서 좌표계 변환
        int x=8-pos.charAt(1)+48;
        int y=pos.charAt(0)-65;

        //나이트가 움직일 수 있는 칸은 총 8칸이며, pos 주위의 8칸 중 inRange 함수 범위에 들어오는 건만 추출하면 됨

        int dx[]={-2,-1,1,2,-2,-1,1,2};
        int dy[]={1,2,2,1,-1,-2,-2,-1};

        int i=0;
        int j=0;
        for(int k=0;k<8;k++){
            i=x+dx[k];
            j=y+dy[k];
            if(inRange(i,j)) answer++;
        }
        return answer;
    }

    // The following is main method to output testcase.
    public static void main(String[] args) {
        MySolution sol = new MySolution();
        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 + " .");
    }
}

 

정답


정답 파일 보니, 거의 비슷한데, Ascii코드 계산하는 부분에서 차이가 있습니다. 굳이 숫자로 바꾸지 않고, char 그대로 계산해도 되는 거군요..


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);
    }  
}

 

첨부 파일


프로젝트 파일 전체를 첨부합니다.

Solution 이 문제, CorrectSolution 이 정답, MySolution이 제가 푼 것입니다.
"Project from existing sources..." 메뉴에서 불러다 쓰시면 됩니다.

FirstQuestion3.zip
0.01MB

출처: https://www.ybmit.com/cos_pro/cos_pro_r_test.jsp

728x90

댓글