[BAEKJOON] 백준 32372: 마법의 나침반 (C#)

2024. 11. 4. 10:45IT/BaekJoon

문제 링크

https://www.acmicpc.net/problem/32372

 

 

문제

마법의 나침반을 이용해 N x N 지역에 숨겨진 보물을 찾으려 합니다.

위 그림은 첫 번째 예제를 나타낸 것입니다. 나침반을 작동시키면 왼쪽 그림과 같이 붉은색 침이 상하좌우 대각선 8방향 중 보물의 방향을 가리킵니다.

위쪽부터 시계방향으로 각각 1번부터 8번 방향으로 정의합니다. 각 방향에 대한 설명은 다음과 같습니다.

좌표 (x,y)는 위에서부터 x번째 칸, 왼쪽에서부터 y번째 칸을 의미합니다. (x,y는 1이상 N이하의 양의 정수입니다.)

  • 1번 방향: 보물은 x좌표가 작고, y좌표가 같은 곳에 있습니다.
  • 2번 방향: 보물은 x좌표가 작고, y좌표가 큰 곳에 있습니다.
  • 3번 방향: 보물은 x좌표가 같고, y좌표가 큰 곳에 있습니다.
  • 4번 방향: 보물은 x좌표가 크고, y좌표가 큰 곳에 있습니다.
  • 5번 방향: 보물은 x좌표가 크고, y좌표가 같은 곳에 있습니다.
  • 6번 방향: 보물은 x좌표가 크고, y좌표가 작은 곳에 있습니다.
  • 7번 방향: 보물은 x좌표가 같고, y좌표가 작은 곳에 있습니다.
  • 8번 방향: 보물은 x좌표가 작고, y좌표가 작은 곳에 있습니다.

 M번의 나침반 사용기록을 이용해 보물의 위치를 찾아주세요. 나침반을 작동시킨 위치와 보물의 위치는 항상 다르며, 정답이 유일하게 존재함이 보장됩니다.

 

 

입력

첫 번째 줄에 정수 N과 M이 공백으로 구분되어 주어집니다. (2≤N≤10,1≤M<N2)

두 번째 줄부터 M개의 줄에 걸쳐 i번째 나침반을 사용한 좌표 Xi,Yi와 해당 위치에서의 보물의 방향 Ki가 공백으로 구분되어 주어집니다. (1≤Xi,Yi≤N,1≤Ki≤8, Xi,Yi,Ki는 모두 정수입니다.)

 

 

출력

보물이 숨겨진 위치의 좌표를 출력해주세요.

 

 

 

통과한 답안

namespace _32372
{
    internal class Program
    {
        static void Main(string[] args)
        {
            string[] inputs = Console.ReadLine().Split(' ');
            int N = int.Parse(inputs[0]);
            int M = int.Parse(inputs[1]);
            List<int> answerX = Enumerable.Range(1, N).ToList();
            List<int> answerY = Enumerable.Range(1, N).ToList();

            for (int i = 0; i < M; i++)
            {
                inputs = Console.ReadLine().Split(' ');
                int x = int.Parse(inputs[0]);
                int y = int.Parse(inputs[1]);
                int direction = int.Parse(inputs[2]);

                switch (direction)
                {
                    case 1: 
                        answerX = answerX.Where(pos => pos < x).ToList();
                        answerY = answerY.Where(pos => pos == y).ToList();
                        break;
                    case 2:
                        answerX = answerX.Where(pos => pos < x).ToList();
                        answerY = answerY.Where(pos => pos > y).ToList();
                        break;
                    case 3:
                        answerX = answerX.Where(pos => pos == x).ToList();
                        answerY = answerY.Where(pos => pos > y).ToList();
                        break;
                    case 4:
                        answerX = answerX.Where(pos => pos > x).ToList();
                        answerY = answerY.Where(pos => pos > y).ToList();
                        break;
                    case 5:
                        answerX = answerX.Where(pos => pos > x).ToList();
                        answerY = answerY.Where(pos => pos == y).ToList();
                        break;
                    case 6:
                        answerX = answerX.Where(pos => pos > x).ToList();
                        answerY = answerY.Where(pos => pos < y).ToList();
                        break;
                    case 7:
                        answerX = answerX.Where(pos => pos == x).ToList();
                        answerY = answerY.Where(pos => pos < y).ToList();
                        break;
                    case 8:
                        answerX = answerX.Where(pos => pos < x).ToList();
                        answerY = answerY.Where(pos => pos < y).ToList();
                        break;
                }
            }

            Console.WriteLine($"{answerX[0]} {answerY[0]}");
        }
    }
}

 

N x N 크기의 좌표평면에 M개의 정보가 주어졌을 때 보물이 숨겨진 장소를 찾는 문제이다.

M개의 정보에서 각각 x, y 좌표와 방향의 정보가 주어지므로,

각각의 정보에 맞게 x, y 좌표의 범위를 줄이는 방식으로 구현하였다.

 

x, y의 좌표가 될 수 있는 수들을 answerX와 answerY의 리스트로 구현한 후에

방향 정보에 따라 switch문에서 해당하는 조건에 맞게 리스트를 재구성하게 구현하였다.

특히 LINQ의 list.Where(조건).ToList()를 통해서 리스트의 범위를 재구성한 것이 특징이다.