ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [구현] 왕실의 나이트
    알고리즘/이코테 - 실전 2021. 7. 15. 18:22

    난이도 : 하 풀이시간 : 20분 시간제한 : 1초

    [ 구현 ] 왕실의 나이트

    행복 왕국의 왕실 정원은 체스판과 같은 8 × 8 좌표 평면이다. 왕실 정원의 특정한 한 칸에 나이트가 서있다.
    나이트는 매우 충성스러운 신하로서 매일 무술을 연마한다
    나이트는 말을 타고 있기 때문에 이동을 할 때는 L자 형태로만 이동할 수 있으며 정원 밖으로는 나갈 수 없다
    나이트는 특정 위치에서 다음과 같은 2가지 경우로 이동할 수 있다

    1. 수평으로 두 칸 이동한 뒤에 수직으로 한 칸 이동하기
    2. 수직으로 두 칸 이동한 뒤에 수평으로 한 칸 이동하기


    이처럼 8 × 8 좌표 평면상에서 나이트의 위치가 주어졌을 때 나이트가 이동할 수 있는 경우의 수를 출력하는
    프로그램을 작성하라. 왕실의 정원에서 행 위치를 표현할 때는 1부터 8로 표현하며, 열 위치를 표현할 때는
    a 부터 h로 표현한다

    • c2에 있을 때 이동할 수 있는 경우의 수는 6가지이다
    • a1에 있을 때 이동할 수 있는 경우의 수는 2가지이다

     

    :: 입력 조건

     

    첫째 줄에 8x8 좌표 평면상에서 현재 나이트가 위치한 곳의 좌표를 나타내는 두 문자로 구성된 문자열이 입력된다. 입력 문자는 a1 처럼 열과 행으로 이뤄진다.

     

    예시 ) 

     

    a1

     

    :: 출력 조건

     

    첫째 줄에 나이트가 이동할 수 있는 경우의 수를 출력하시오.

     

    예시 )

     

    2


     

      내   코드  

     

    #include <stdio.h>
    #include <iostream>
    #include <string>
    #include <vector>
    #include<stack>
    #include <algorithm>
    
    using namespace std;
    
    
    int main() {
    
    	int dir_x[8] = { 2, 2, -2, -2, 1, 1, -1, -1 };
    	int dir_y[8] = { 1, -1, 1, -1, 2, -2, 2, -2 };
    
    	string pos;
    
    	int cnt = 0;
    
    	cin >> pos;
    
    	char a=pos[0], b=pos[1];
    
    	for (int i = 0; i < 8; i++) {
    		int pos_x = (int)a - 96 + dir_x[i];
    		int pos_y = (b - '0') + dir_y[i];
    
    		if (1 <= pos_x && pos_x <= 8 && 1 <= pos_y && pos_y <= 8 ) {
    			cnt++;
    		}
    	}
    
    	printf("%d\n", cnt);
    }

     

      정답  코드  

    #include <bits/stdc++.h>
    
    using namespace std;
    
    string inputData;
    
    // 나이트가 이동할 수 있는 8가지 방향 정의
    int dx[] = {-2, -1, 1, 2, 2, 1, -1, -2};
    int dy[] = {-1, -2, -2, -1, 1, 2, 2, 1};
    
    int main(void) {
        // 현재 나이트의 위치 입력받기
        cin >> inputData;
        int row = inputData[1] - '0';
        int column = inputData[0] - 'a' + 1;
    
        // 8가지 방향에 대하여 각 위치로 이동이 가능한지 확인
        int result = 0;
        for (int i = 0; i < 8; i++) {
            // 이동하고자 하는 위치 확인
            int nextRow = row + dx[i];
            int nextColumn = column + dy[i];
            // 해당 위치로 이동이 가능하다면 카운트 증가
            if (nextRow >= 1 && nextRow <= 8 && nextColumn >= 1 && nextColumn <= 8) {
                result += 1;
            }
        }
    
        cout << result << '\n';
        return 0;
    }

     

     

      리뷰  

    새로운 포지션을 계산하는 부분에서 

    정답코드랑 조금 달랐다

    아직 문자열 -> 정수 , 정수 -> 문자열이 익숙하지 않은 듯

     

    그 부분 빼고는 아이디어도 정답 코드랑 같앗음 !

    int row = inputData[1] - '0';
    int column = inputData[0] - 'a' + 1;
준생e