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