[BOJ][C#] 1063 킹

LimJaeJun·2023년 12월 23일
0

PS/BOJ

목록 보기
73/108

📕 문제

📌 링크

📗 접근 방식

딕셔너리 초기화:

  • 명령어에 따른 이동 방향을 Dictionary에 저장한다. 여기서 튜플을 사용하여 각 명령어에 대한 x, y 방향을 저장한다.
  • 해당 명령어 따른 이동 방향을 O(1)의 시간복잡도로 가져올 수 있도록 Dictionary 자료구조를 사용하였다.

입력 받기:

  • 초기 킹(kingX, kingY)과 돌(stoneX, stoneY)의 위치, 이동 명령 횟수(movingCount)를 입력으로 받는다. 문자열을 정수 좌표로 변환하여 저장한다.

이동 명령 수행:

  • 이동 후의 위치가 체스판을 벗어나지 않는지 확인한다. 만약 킹이나 돌이 벗어나면 해당 명령어는 무시하고 넘어간다.
  • 킹과 돌이 이동한 위치를 저장하면서, 킹이 돌의 위치에 도달하면 돌도 같이 이동해준다. 다만, 이동 후 돌이 체스판을 벗어나지 않는지도 확인한다.

결과 출력:

  • 최종적으로 킹과 돌의 위치를 출력한다.

📘 코드

using System.Text;

namespace BOJ
{
    class No_1063
    {
        const int BOARD_MAX = 8;
        
        static void Main()
        {
            StringBuilder sb = new StringBuilder();
            Dictionary<string, (int, int)> dict = new Dictionary<string, (int, int)>();
            dict.Add("R", (1, 0));
            dict.Add("L", (-1, 0));
            dict.Add("B", (0, -1));
            dict.Add("T", (0, 1));
            dict.Add("RT", (1, 1));
            dict.Add("LT", (-1, 1));
            dict.Add("RB", (1, -1));
            dict.Add("LB", (-1, -1));
            
            string[] inputs = Console.ReadLine().Split();
            int kingX = inputs[0][0] - 'A';
            int kingY = int.Parse(inputs[0][1].ToString())-1;

            int stoneX = inputs[1][0] - 'A';
            int stoneY = int.Parse(inputs[1][1].ToString())-1;
           
            int movingCount = int.Parse(inputs[2]);

            for (int i = 0; i < movingCount; i++)
            {
                string command = Console.ReadLine();

                (int dx, int dy) = dict[command];

                int nx = kingX + dx;
                int ny = kingY + dy;
                
                if(nx<0 || ny<0 || nx>=BOARD_MAX || ny>=BOARD_MAX) continue;

                if (nx == stoneX && ny == stoneY)
                {
                    int nnx = stoneX + dx;
                    int nny = stoneY + dy;
                    
                    if(nnx<0 || nny<0 || nnx>=BOARD_MAX || nny>=BOARD_MAX) continue;
                    
                    stoneX = nnx;
                    stoneY = nny;
                }

                kingX = nx;
                kingY = ny;
            }

            sb.AppendLine($"{(char)(kingX + 'A')}{kingY + 1}");
            sb.AppendLine($"{(char)(stoneX + 'A')}{stoneY + 1}");

            Console.Write(sb);
        }
    }   
}

📙 오답노트

📒 알고리즘 분류

  • 구현
  • 시뮬레이션
profile
Dreams Come True

0개의 댓글

관련 채용 정보