[프로그래머스] 공원 산책
1. 문제
2. 개요
길을 ‘O’ 장애물을 ‘X’로 나타낸 직사각형 격자 모양의 공원에서 산책을 하려 한다.
산책은 주어진 명령의 순서대로 진행되며, 명령은 "방향 거리", "방향 거리" ...
와 같은 형식으로 주어진다.
명령을 수행하기 이전에는 밑의 두 가지를 먼저 확인한다.
- 이동 시 공원 내부를 벗어나는지 확인한다.
- 이동 중 장애물과 만나는지 확인한다.
위 두 가지 중 어느 하나라도 해당된다면, 해당 명령은 무시하고 다음 명령을 수행한다.
시작점, 길, 장애물이 표시된 지도 정보와 명령 배열이 주어졌을 때 최종 목적지를 반환하는 문제.
3. 풀이 및 코드
3-1. 풀이
먼저 지도를 확인하여 시작 위치를 현재 위치로 설정해둔다.
명령을 하나하나 확인하면서, 방향과 거리를 확인한다.
현재 위치에서 주어진 방향으로 주어진 거리만큼 이동 시 지도 밖이거나, 주어진 방향으로 1씩 주어진 거리만큼 이동하는 동안 장애물을 만난다면 False를, 그렇지 않다면 True를 리턴하는 ChkDest함수를 이용하여, True라면 현재위치를 명령만큼 이동시킨다.
모든 명령을 확인했다면 현재 위치를 리턴한다.
3-2. C#
using System;
using System.Collections.Generic;
public class Solution {
static int[] dirY = { -1, 0, 1, 0 };
static int[] dirX = { 0, -1, 0, 1 };
static int parkw;
static int parkh;
public int[] solution(string[] park, string[] routes)
{
parkh = park.Length;
parkw = park[0].Length;
Dictionary<string, int> dirdict = new Dictionary<string, int>() { { "N", 0 }, { "W", 1 }, { "S", 2 }, { "E", 3 } };
int[] nowPos = new int[] { -1, -1 };
for (int i = 0; i < parkh; i++)
{
for (int j = 0; j < parkw; j++)
{
if (park[i][j] == 'S')
{
nowPos[0] = i;
nowPos[1] = j;
break;
}
}
if (nowPos[0] != -1 || nowPos[1] != -1)
break;
}
foreach (string move in routes)
{
string[] command = move.Split();
int dir = dirdict[command[0]];
int distance = int.Parse(command[1]);
if (ChkDest(nowPos[0], nowPos[1], dir, distance, park))
{
nowPos[0] += dirY[dir] * distance;
nowPos[1] += dirX[dir] * distance;
}
}
int[] answer = new int[] { nowPos[0], nowPos[1] };
return answer;
}
bool ChkDest(int y, int x, int dir, int distance, string[] park)
{
int destY = y + dirY[dir] * distance;
int destX = x + dirX[dir] * distance;
if (destY < 0 || destY >= parkh || destX < 0 || destX >= parkw)
return false;
int nextY = y;
int nextX = x;
for (int i = 1; i <= distance; i++)
{
nextY = nextY + dirY[dir];
nextX = nextX + dirX[dir];
if (park[nextY][nextX] == 'X')
return false;
}
return true;
}
}
Comments