프로그래머스

[프로그래머스] [C] Lv.1 공원 산책

꼬맹님 2025. 4. 10. 15:34
반응형

문제 설명

지나다니는 길을 'O', 장애물을 'X'로 나타낸 직사각형 격자 모양의 공원에서 로봇 강아지가 산책을 하려합니다. 산책은 로봇 강아지에 미리 입력된 명령에 따라 진행하며, 명령은 다음과 같은 형식으로 주어집니다.

["방향 거리", "방향 거리" ]

예를 들어 "E 5"는 로봇 강아지가 현재 위치에서 동쪽으로 5칸 이동했다는 의미입니다. 로봇 강아지는 명령을 수행하기 전에 다음 두 가지를 먼저 확인합니다.

주어진 방향으로 이동할 때 공원을 벗어나는지 확인합니다.

주어진 방향으로 이동 중 장애물을 만나는지 확인합니다.

위 두 가지중 어느 하나라도 해당된다면, 로봇 강아지는 해당 명령을 무시하고 다음 명령을 수행합니다.
공원의 가로 길이가 W, 세로 길이가 H라고 할 때, 공원의 좌측 상단의 좌표는 (0, 0), 우측 하단의 좌표는 (H - 1, W - 1) 입니다.

 

공원을 나타내는 문자열 배열park, 로봇 강아지가 수행할 명령이 담긴 문자열 배열routes가 매개변수로 주어질 때, 로봇 강아지가 모든 명령을 수행 후 놓인 위치를 [세로 방향 좌표, 가로 방향 좌표] 순으로 배열에 담아 return 하도록 solution 함수를 완성해주세요.

 

제한사항

3 park의 길이 50

3 park[i]의 길이 50

park[i]는 다음 문자들로 이루어져 있으며 시작지점은 하나만 주어집니다.

S : 시작 지점

O : 이동 가능한 통로

X : 장애물

park는 직사각형 모양입니다.

1 routes의 길이 50

routes의 각 원소는 로봇 강아지가 수행할 명령어를 나타냅니다.

로봇 강아지는routes의 첫 번째 원소부터 순서대로 명령을 수행합니다.

routes의 원소는 "op n"과 같은 구조로 이루어져 있으며, op는 이동할 방향, n은 이동할 칸의 수를 의미합니다.

op는 다음 네 가지중 하나로 이루어져 있습니다.

N : 북쪽으로 주어진 칸만큼 이동합니다.

S : 남쪽으로 주어진 칸만큼 이동합니다.

W : 서쪽으로 주어진 칸만큼 이동합니다.

E : 동쪽으로 주어진 칸만큼 이동합니다.

1 n 9

 

입출력 예

park routes result
["SOO","OOO","OOO"] ["E 2","S 2","W 1"] [2,1]
["SOO","OXX","OOO"] ["E 2","S 2","W 1"] [0,1]
["OSO","OOO","OXO","OOO"] ["E 2","S 3","W 1"] [0,0]

 

입출력 예 설명

입출력 예 #1

입력된 명령대로 동쪽으로 2, 남쪽으로 2, 서쪽으로 1칸 이동하면 [0,0] -> [0,2] -> [2,2] -> [2,1]이 됩니다.

입출력 예 #2

입력된 명령대로라면 동쪽으로 2, 남쪽으로 2, 서쪽으로 1칸 이동해야하지만 남쪽으로 2칸 이동할 때 장애물이 있는 칸을 지나기 때문에 해당 명령을 제외한 명령들만 따릅니다. 결과적으로는 [0,0] -> [0,2] -> [0,1]이 됩니다.

입출력 예 #3

처음 입력된 명령은 공원을 나가게 되고 두 번째로 입력된 명령 또한 장애물을 지나가게 되므로 두 입력은 제외한 세 번째 명령만 따르므로 결과는 다음과 같습니다. [0,1] -> [0,0]

 

 

로봇 강아지 산책 경로 계산 프로그램

이 코드는 직사각형 공원에서 로봇 강아지가 주어진 경로 명령을 수행하며 장애물을 피해 최종 위치를 계산하는 프로그램입니다. 공원은 문자열 배열로 표현되며, 각 명령은 방향과 이동 거리를 나타냅니다. 이 프로그램은 입력받은 공원과 명령을 바탕으로 로봇 강아지의 시작 지점에서 이동을 수행한 뒤 최종 위치를 반환합니다.

프로그램의 주요 기능

  1. 시작 지점 찾기: 공원에서 S로 표시된 로봇 강아지의 초기 위치를 탐색합니다.
  2. 명령어 처리: 이동 명령어를 분석하고, 해당 방향으로 지정된 거리만큼 이동 가능한지 확인합니다.
  3. 이동 가능성 검사: 장애물(X) 또는 공원 경계에 의해 이동이 제한되는 경우 명령을 무시합니다.
  4. 최종 위치 계산: 주어진 명령어를 순서대로 처리한 후, 로봇 강아지의 최종 좌표를 반환합니다.

코드 상세 설명

c
int* solution(const char* park[], size_t park_len, const char* routes[], size_t routes_len) {
    int* answer = (int*)malloc(2*sizeof(int)); // 최종 좌표를 저장할 동적 메모리 할당
    int park_len2 = strlen(park[0]); // 공원의 가로 길이
    int start_x = -1, start_y = -1;
  • answer는 동적 메모리를 할당하여 결과 좌표를 저장합니다.
  • park_len2는 공원의 가로 길이를 계산하며, start_x와 start_y는 시작 지점을 추적하는 변수입니다.

1. 시작 지점 찾기

c
for (size_t i = 0; i < park_len; i++) {
    for (int j = 0; j < park_len2; j++) {
        if (park[i][j] == 'S') {
            start_x = i;
            start_y = j;
        }
    }
}
  • 공원 배열을 탐색하며 S 위치를 찾습니다.
  • S의 행과 열 좌표를 start_x와 start_y에 저장합니다.

2. 경로 명령어 처리

c
for (size_t i = 0; i < routes_len; i++) {
    char direction;
    int distance;
    sscanf(routes[i], "%c %d", &direction, &distance);
  • sscanf를 사용하여 명령어에서 이동 방향(direction)과 거리(distance)를 추출합니다.
  • 방향에 따라 이동 벡터(dx, dy)를 계산합니다:
    • W (서쪽): dy = -1
    • E (동쪽): dy = 1
    • S (남쪽): dx = 1
    • N (북쪽): dx = -1

3. 이동 가능 여부 확인

c
int valid = 1;
for (int j = 1; j <= distance; j++) {
    int nx = start_x + dx * j;
    int ny = start_y + dy * j;

    if (nx < 0 || nx >= park_len || ny < 0 || ny >= park_len2 || park[nx][ny] == 'X') {
        valid = 0;
        break;
    }
}
  • 이동 경로를 따라 한 칸씩 이동하며, 다음 조건을 확인합니다:
    1. 공원의 경계를 벗어나는지 (nx 또는 ny가 배열 범위를 벗어나면 이동 불가).
    2. 이동 경로에 장애물(X)이 있는지.
  • 조건을 만족하지 않으면 valid를 0으로 설정하여 명령을 무시합니다.

4. 최종 위치 업데이트

c
if (valid) {
    start_x += dx * distance;
    start_y += dy * distance;
}
  • 이동이 가능하면, 시작 좌표를 명령에 따라 갱신합니다.

5. 결과 반환

c
answer[0] = start_x;
answer[1] = start_y;
return answer;
  • 최종 좌표를 answer 배열에 저장하고 반환합니다.
  • 메모리 누수를 방지하기 위해 호출자에서 반환된 배열을 해제해야 합니다.

예제 실행

c
int main() {
    const char* park[] = { "SOO", "OOO", "OOO" };
    const char* routes[] = { "E 2", "S 2", "W 1" };

    int* result = solution(park, 3, routes, 3);
    if (result) {
        printf("[%d, %d]\n", result[0], result[1]);
        free(result); // 동적 메모리 해제
    }
    return 0;
}

입력

  • 공원 배열: ["SOO", "OOO", "OOO"]
  • 명령: ["E 2", "S 2", "W 1"]

출력

  • 결과: [2, 1]

 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int* solution(const char* park[], size_t park_len, const char* routes[], size_t routes_len) {
    int* answer = (int*)malloc(2 * sizeof(int));
    int park_len2 = strlen(park[0]);
    int start_x = -1, start_y = -1;

    for (size_t i = 0; i < park_len; i++) {
        for (int j = 0; j < park_len2; j++) {
            if (park[i][j] == 'S') {
                start_x = i;
                start_y = j;
            }
        }
    }

    for (size_t i = 0; i < routes_len; i++) {
        char direction;
        int distance;
        sscanf(routes[i], "%c %d", &direction, &distance);

        int dx = 0, dy = 0;
        if (direction == 'W') dy = -1;
        else if (direction == 'E') dy = 1;
        else if (direction == 'S') dx = 1;
        else if (direction == 'N') dx = -1;

        int valid = 1;
        for (int j = 1; j <= distance; j++) {
            int nx = start_x + dx * j;
            int ny = start_y + dy * j;

            if (nx < 0 || nx >= park_len || ny < 0 || ny >= park_len2 || park[nx][ny] == 'X') {
                valid = 0;
                break;
            }
        }

        if (valid) {
            start_x += dx * distance;
            start_y += dy * distance;
        }
    }

    answer[0] = start_x;
    answer[1] = start_y;
    return answer;
}
반응형