본문 바로가기
프로그래머스/C

[프로그래머스/C]프로그래머스 Level 1 : 공원 산책 C언어

by starfish22 2023. 4. 30.
728x90

▶문제 : 코딩테스트 연습 - 공원 산책 | 프로그래머스 스쿨 (programmers.co.kr)

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

▶코드 작성

#include <stdio.h>
#include <stdbool.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(sizeof(int) * 2);
    int width = strlen(park[0]);
    int height = park_len;
    int px, py;
    bool pass = false;

    for (int y = 0; y < height && !pass; y++) {//'S' 위치 찾기
        for (int x = 0; x < width; x++) {
            if (park[y][x] == 'S') {
                px = x;
                py = y;
                pass = true;
                break;
            }
        }
    }

    int x, y;
    for (int i = 0; i < routes_len; i++) {
        pass = true;
        switch (routes[i][0]) {
        case 'E':
            for (x = 1; x <= routes[i][2] - '0'; x++) {//거리만큼 반복
                if (park[py][px + x] == 'X' || px + x == width) {
                //'X'가 있거나 공원을 벗어난다면 종료
                    pass = false;
                    break;
                }
            }
            if (pass) px = px + x - 1;//정상적인 길이라면 대입
            break;
        case 'W':
            for (x = 1; x <= routes[i][2] - '0'; x++) {//'E'와 동일
                if (park[py][px - x] == 'X' || px - x < 0) {
                    pass = false;
                    break;
                }
            }
            if (pass) px = px - x + 1;
            break;
        case 'S':
            for (y = 1; y <= routes[i][2] - '0'; y++) {//'E'와 동일
                if (park[py + y][px] == 'X' || py + y == height) {
                    pass = false;
                    break;
                }
            }
            if (pass) py = py + y - 1;
            break;
        case 'N':
            for (y = 1; y <= routes[i][2] - '0'; y++) {//'E'와 동일
                if (park[py - y][px] == 'X' || py - y < 0) {
                    pass = false;
                    break;
                }
            }
            if (pass) py = py - y + 1;
            break;
        }
    }

    answer[0] = py;
    answer[1] = px;
    return answer;
}

 

▶해석

'S'의 위치부터 파악한 뒤 routes 배열을 반복하여 움직였다.

'동서남북' 각각 switch로 나누어 routes배열에 적힌 거리만큼 반복하여

한 칸씩 park배열을 탐색하면서 'X'인지, 공원을 벗어나는지 확인하였다.

정상적으로 이동했다면 pass는 true이므로 'S'의 위치(px, py)에서 알맞게 이동하였다.

728x90

댓글