Coding Test/Programmers

[Lv.1] 공원 산책 [프로그래머스_코딩테스트] [시뮬레이션] [25분]

whawoo 2025. 5. 26. 15:55
반응형

🔍 문제 요약

https://school.programmers.co.kr/learn/courses/30/lessons/172928

 

프로그래머스

SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

S라는 지점에서 시작해서 이동 루트를 string으로 적은 배열을 주어주고 이동 불가 지점과 벽에 막힌 경우 해당 이동 명령은 무시하게 한 후 최종 결과를 도출해 내는 문제 (X는 이동 불가, O는 이동 가능)

🧠 나의 접근 방식과 시행착오

간단하게 생각해서 시작점에서 명령(routes)를 하나씩 돌리면서 이동 가능한 지 체크하고 이동시키면 된다. (필자는 참고로 한 번 실수로 좌표가 마이너스가 될 경우를 누락해서 런타임 에러가 났었다. 이건 정말 기초적인 실수라 실수하지 않게 주의해야겠다. 가로 세로 넘치는 건 했으면서...) 코드는 아래와 같다. 따로 피드백이 필요한 코드는 아닐 것 같은 문제. 추가로 이 문제는 gpt가 25분을 예상하고 줬으나 디버깅까지 해서 30~35분 정도가 걸렸던 문제. 잘 돌아가는지 테스트를 해보고 실수가 발견되면 시간 소요가 생각보다 있게 되므로 주의해야 할 것. (문제의 난이도는 lv1이라 그런지 기초적인 부분에 해당 하는 듯 하다) 추가로 string을 int로 parse하는 것도 자주 쓰이는 int.Parse()를 쓴다는 것도 있지 않아야 할 것. string Split 역시 마찬가지

using System;
using System.Collections.Generic;

public class Solution
{
    /// <summary>
    /// 공원 산책
    /// https://school.programmers.co.kr/learn/courses/30/lessons/172928
    /// </summary>
    public int[] solution(string[] park, string[] routes)
    {
        // S 시작점
        // O 이동 가능
        // X 이동 불가능
        
        // E 동, W 서, S 남, N 북

        // 1. 가로, 세로 길이 구하기
        int row = park[0].Length;
        int height = park.Length;
        
        // 2. 시작 좌표 찾기
        int[] start = {0, 0};
        
        for (int y = 0; y < height; y++)
        {
            for (int x = 0; x < row; x++)
            {
                if (park[y][x] == 'S')
                {
                    start = new []{x, y};
                    break;
                }
            }
        }

        int index = 0;
        var pos = start;
        // 3. 시작점에서 routes대로 이동하기
        while (index < routes.Length)
        {
            var current = routes[index];

            var splits = current.Split(' ');

            var direction = splits[0];
            int move = int.Parse(splits[1]);
            int[] directVal = { 0, 0 };

            switch (direction)
            {
                case "E":
                    directVal[0] = 1;
                    break;
                case "W":
                    directVal[0] = -1;
                    break;
                case "S":
                    directVal[1] = 1;
                    break;
                case "N":
                    directVal[1] = -1;
                    break;
            }

            var startPos = pos;

            for (int i = 1; i <= move; i++)
            {
                // 이동 후 좌표
                var tempPos = new[] { startPos[0] + directVal[0] * i, startPos[1] + directVal[1] * i };

                // 이동 불가
                if (tempPos[0] < 0 || tempPos[0] >= row || tempPos[1] >= height || tempPos[1] < 0)
                {
                    pos = startPos;
                    break;
                }
                // 이동 불가
                if (park[tempPos[1]][tempPos[0]] == 'X')
                {
                    pos = startPos;
                    break;
                }

                pos = tempPos;
            }
            
            index++;
        }
        
        int[] answer = new int[] {pos[1], pos[0]};
        return answer;
    }
}

/// <summary>
/// C# 7.3
/// </summary>
internal class Program
{
    public static void Main(string[] args)
    {
        var sl = new Solution();
        var park1 = new [] { "SOO", "OOO", "OOO" };
        var routes1 = new[] { "E 2", "S 2", "W 1" };
        var park2 = new [] { "SOO","OXX","OOO" };
        var routes2 = new[] { "E 2","S 2","W 1" };
        var park3 = new [] { "OSO","OOO","OXO","OOO" };
        var routes3 = new[] { "E 2","S 3","W 1" };
        var res1 = sl.solution(park1, routes1);
        var res2 = sl.solution(park2, routes2);
        var res3 = sl.solution(park3, routes3);
        
        Console.WriteLine($"[{res1[0]}, {res1[1]}]");
        Console.WriteLine($"[{res2[0]}, {res2[1]}]");
        Console.WriteLine($"[{res3[0]}, {res3[1]}]");
    }
}

✅ 풀이 코드

추가로 풀이코드가 없어도 될 문제라 따로 올리지 않았다. 

🔄 정리

위 시행착오 쪽에서 했던 실수 좌표 음수나 가로 세로 길이 넘기는 부분 예외처리 잘 막아주고, int Parse, string Split만 잘 기억하기

반응형