코딩테스트

[코딩 테스트] 공원 산책

CCS_Cheese 2025. 8. 20. 19:56

오늘 풀어볼 문제는 프로그래머스의 공원 산책이라는 문제를 풀어보도록 하겠습니다.

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

 

프로그래머스

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

programmers.co.kr

공원 산책 : 출처 "프로그래머스" 코딩 테스트 문제 

 

문제

산책 가능한 격자무늬의 공원 안에서, 산책이 가능한 영역에 대한 정보와, 산책이 이루어진 경로가 주어질 때

산책이 이루어진 경로를 전부 수행한 결과의 위치를 찾으시오.

 

문제 조건

  • 지나다니는 길을 'O', 장애물(지나갈수 없는 길) 'X', 시작 위치 'S'로 산책이 가능한 영역에 대한 정보를 전달받습니다.
  • 산책이 이루어진 경로는 문자열로 이루어져, "방향 거리"형태의 공백으로 구분된 문자열 배열을 전달받습니다.
  • 주어진 방향으로 이동할 때 공원의 범위(격자무늬 영역) 으로 벗어나게된 경우 해당 "방향 거리" 산책 문자열은 스킵합니다.
  • 주어진 방향으로 이동하던 중 장애물을 마주치게 되면 마찬가지로 "방향 거리" 해당 산책 문자열은 스킵합니다.
  • 격자무늬 안에서 왼쪽 상단은 0,0을 의미하고, 우측하단은 W - 1, H - 1로 표기됩니다.
  • 방향은 N(북), S(남), W(서), E(동)으로 표기하며, 거리는 양의 정수형입니다.

파라미터 정보

  • string [] park : 지나가는 길, 장애물, 시작위치의 정보에 대한 문자열 배열 
  • string[] route : 산책을 진행한 이동 경로 문자열 "방향 거리"

선택된 자료구조

지나다는 길, 장애물, 시작점에 대한 정보를 저장하기 위해 격자무늬형태를 2차원 배열을 활용하여 문자를 최초에 저장하려고 하였습니다. 하지만 결국 시작 위치를 제외하고는 이동 가능한지에대한 여부판단을 진행하면 되기 때문에, 문자로 저장하고, 이를 비교하면 매 확인 시점바다 문자열 or 문자 비교를 진행해야 되어, 이동 가능여부(bool) 값을 통한 직관성을 가져왔습니다. 그 이후 시작 위치를 포함한 현재 위치 값을 Pos형태의 x, y 형태의 1차원 배열을 활용하여 이동에 대한 처리를 진행하였습니다.

 

공원의 정보 데이터 변환

maxRow = park.Length;
maxColumn = park[0].Length;
bool[,] parkMap = new bool[maxRow, maxColumn];
for(int i = 0; i < park.Length; i++)
{
	for(int j = 0; j < park[i].Length; j++)
	{
		char parkChar = park[i][j];
		if ( parkChar == 'S') 
		{
			answer = new int[] { i, j };
		}
        if ( parkChar == 'X')
        {
        	parkMap[i,j] = false;
        }
        else
        {
        	parkMap[i,j] = true;
        }
	}
}
park 배열의 길이만큼 공원의 H(세로)가 형성되게 되고, park [0]의 문자열의 길이만큼 W(가로)가 형성되게 된다. 
Ex) park [] = [ "SOO", "XOO" ]라고 하면 H = 2, W = 3을 의미
데이터 변환을 진행 시 최초 1번만 문자 비교를 진행 'S', 'O' : true, 'X' : false로 변환

 

이동 함수 구현

현재 위치 Pos를 기반으로 산책 경로 배열을 수행하여, 해당 명령을 수행할 수 있도록 함수화 하여 이동을 진행.
    private int[] Move(bool[,] parkMap, int[] pos, string routes)
    {
        int i = pos[0];
        int j = pos[1];
        string[] route = routes.Split(' ');
        string dir = route[0];
        string stepString = route[1];
        int step = int.Parse(stepString);
        
        for(int stepWalk = 0; stepWalk < step; stepWalk++)
        {
            bool isMove = true;
            switch(dir)
            {
                case "E":
                    j++;
                    break;
                case "S":
                    i++;
                    break;
                case "W":
                    j--;
                    break;
                case "N":
                    i--;
                    break;
            }
            isMove = IsMove(parkMap, i, j);
            if (!isMove )
            {
                return pos;
            }
        }
        return new int[] {i, j};
    }
    
     private bool IsMove(bool[,] parkMap, int i, int j)
    {
        if (maxRow > i && maxColumn > j && i >= 0 && j >= 0 )
        {    
            return parkMap[i,j]; 
        }
        else
        {
            return false;
        }
    }
parkMap을 기반으로 방향에 맞게 이동할 때마다 이동이 가능한지 확인(parkMap이 true인지 false인지)하여, 해당 route를 수행을 완료할지를 판단하여, 모든 route를 진행하여 결괏값 pos [i, j]를 도출하게 됩니다.

 

이 문제를 풀면서 있었던 일

처음 문제에도 나와있었지만, 격자무늬 형태가 왼쪽 위에서 오른쪽 아래 형태로 공원이 구성되는데 이때, 북(인덱스 + 1), 남(인덱스 - 1)으로 문제해석을 실수하여, 의도하지 않은 OutOfRange 오류를 발생시켜 특정 케이스에서만 문제해결이 되지 않았습니다. 실제로는 이동가능한 경로지만, 공원을 벗어난 것으로 판단하여, 잘못된 결과 값을 출력하고 있어, 확인하는데 오랜 시간이 걸렸습니다.
또한, 공원의 정보를 처음 문자로 저장하고, 이를 비교해 보니, 불필요한 문자 비교를 계속해서 진행하는 것을 파악하여, bool값으로 변환하여 이를 조건식 안에 바로 대입하여 보다 직관적으로 로직을 확인할 수 있었습니다. 

 

'코딩테스트' 카테고리의 다른 글

[코딩 테스트] 동영상 재생기  (0) 2025.07.10
[코딩 테스트] 가장 많이 받은 선물  (1) 2025.07.02