ABOUT ME

-

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

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

    [ 구현 ] 왕실의 나이트

     

    행복 왕국의 왕실 정원은 체스판과 같은 8 x 8 좌표 평면이다. 왕실 정원의 특정한 한 칸에 나이트가 서 있다.

     

    나이트는 매우 충성스러운 신하로서 매일 무술을 연마한다.

     

    나이트는 말을 타고 있기 때문에 이동을 할 때는 L자 형태로만 이동할 수 있으며 정원 밖으로는 나갈 수 없다.

     

    나이트는 특정한 위치에서 다음과 같은 2가지 경우로 이동할 수 있다.

     

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

     

    이처럼 8 x 8 좌표 평면상에서 나이트의 위치가 주어졌을 때 나이트가 이동할 수 있는 경우의 수를 출력하는 프로그램을

     

    작성하시오. 이때 왕실의 정원에서 행 위치를 표현할 때는 1부터 8로 표현하며, 열 위치를 표현할 때는 a부터 h로 표현한다.

     

    :: 입력 조건

     

    1. 첫째 줄에 8 x 8 좌표 평면상에서 현재 나이트가 위치한 곳의 좌표를 나타내는 두 문자로 구성된 문자열이 입력된다.

     

        입력 문자는 a1처럼 열과 행으로 이뤄진다.

     

    :: 출력 조건

     

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

     


      아이디어  

    1. string으로 나이트의 위치를 입력받음

    2. 첫 글자는 문자이고 a부터 시작하기 때문에 a의 값인 97을 빼주고 +1 해줌 a => 1 로 치환

    두번째 글자는 숫자라서 그냥 - '0' 해줌

    3. 미리 배열에 방향값을 넣어두고 반복문을 돌면서 체스판 범위를 벗어나는지 체크해서 카운트

    4. 카운트 출력

     

      내   코드  

    #include <iostream>
    #include <vector>
    #include <algorithm>
    #include <queue>
    #include <string>
    
    using namespace std;
    
    int dir_f[] = { 2, 2, -2, -2 };
    int dir_s[] = { 1, -1, 1, -1 };
    
    int main(){
    
    	string s;
    
    	cin >> s;
    
    	int cnt = 0;
    
    	int col_num = s[0] - 97 + 1; // 열
    	int row_num = s[1] -'0'; // 행
    	
    	// 수평 2칸 수직 1칸
    	for (int i = 0; i < 4; i++) {
    		int col = col_num + dir_f[i];
    		int row = row_num + dir_s[i];
    		if (col <= 0 || col > 8 || row > 8 || row <= 0) {
    			continue;
    		}
    		 cnt++;
    	}
    
    	// 수직 2칸 수평 1칸
    	for (int i = 0; i < 4; i++) {
    		int col = col_num + dir_s[i];
    		int row = row_num + dir_f[i];
    		if (col <= 0 || col > 8 || row > 8 || row <= 0) {
    			continue;
    		}
    		 cnt++;
    	}
    
    	cout << 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;
    }

     

      리뷰  

    처음에 답안 코드처럼 8개 짜리 배열을 만들려고 했는데 헷갈려서 포기함

    좀 더 집중해서 풀어야 할 듯 

    시간도 너무 오래 걸렷엉 ,, 

준생e