2024. 11. 4. 10:45ㆍIT/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()를 통해서 리스트의 범위를 재구성한 것이 특징이다.
'IT > BaekJoon' 카테고리의 다른 글
[BAEKJOON] 백준 23899: 알고리즘 수업 - 선택 정렬 5 (C#) (0) | 2024.10.30 |
---|---|
[BAEKJOON] 백준 1864: 문어 숫자 (C#) (1) | 2024.10.30 |
[BAEKJOON] 백준 15236: Dominos (C#) (0) | 2024.10.30 |
[BAEKJOON] 백준 16316: Baby Bites (C#) (1) | 2024.10.29 |
[BAEKJOON] 백준 15751: Teleportation (C#) (1) | 2024.10.29 |