문제 풀기/C#

73. 공원 산책

kagan-draca 2025. 2. 24. 15:57

기본 틀 :

using System;

public class Solution {
    public int[] solution(string[] park, string[] routes) {
        int[] answer = new int[] {};
        return answer;
    }
}

 

처음에는 당연히 시작 포인트 "S"가 2차원 배열의 Row가 0인 Colum에 존재할 것이라 생각하고 문제를 풀었다.

 

제출한 결과 실패한 테스트 케이스가 존재했고, "질문하기"를 살펴보니 Row가 0이 아닌 위치에서 "S"가 존재했다.

 

그래서 반복문을 통해 S가 있는 위치를 찾을 수 있도록 수정해주었다.

 

2번 째 난관으로는 방향에 따른 이동 및 이동 불가를 구현하는 것이었다.

 

처음에는 switch문에 따른 방향을 찾고 Case 문 안에서 반복을 통해 이동을 구현하고자 했다.

 

하지만, 그럴 경우 코드의 중복이 너무 많아지는 문제가 존재했다.

 

그래서 방향에 따른 향후 이동 횟수를 먼저 파악하고

 

다시 반복문을 활용해 대상을 이동시킬 수 있도록 만들어줬다.

 

이때, 공원의 가로 끝과 세로 끝, "X" 위치에는 이동하지 않도록 구현해 원하는 결과를 얻을 수 있도록 해줬다.

 

using System;
using System.Linq;

public class Solution {
    public int[] solution(string[] park, string[] routes) 
    {
        int[] startPoint = new int[2];

        for (int i = 0; i < park.Length; i++)
        {
            int col = park[i].IndexOf('S');
            if(col != -1)
            {
                startPoint[0] = i;
                startPoint[1] = col;
                break;
            }
        }
        
        for(int i = 0; i < routes.Length; i++)
        {
            string[] direction = routes[i].Split(' ');
            
            int upDown = 0, leftRigth = 0;
            switch(direction[0])
            {
                case "N":
                    upDown--;
                    break;
                case "S":
                    upDown++;
                    break;
                case "W":
                    leftRigth--;
                    break;
                case "E":
                    leftRigth++;
                    break;
            }
            
            bool canMove = true;
            
            int nextUpDown = startPoint[0];
            int nextLeftRigth = startPoint[1];
            
            int nextMove = int.Parse(direction[1]);
            for(int j = 0; j < nextMove; j++)
            {
                nextUpDown += upDown;
                nextLeftRigth += leftRigth;
                if (nextUpDown < 0 || nextUpDown >= park.Length || 
                    nextLeftRigth < 0 || nextLeftRigth >= park[0].Length || 
                    park[nextUpDown][nextLeftRigth] == 'X')
                {
                    canMove = false;
                    break;
                }

            }
            
            // 최종 위치로 이동
            if (canMove)
            {
                startPoint[0] = nextUpDown;
                startPoint[1] = nextLeftRigth;
            }
        }
        
        return startPoint;
    }
}