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

YH J·2023년 4월 25일
0

프로그래머스

목록 보기
75/168

문제 링크

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

내 풀이

W, H 값을 구한다.
S의 좌표를 구한다.
while 문을 돌리면서 route의 원소를 파싱해서 방향과 이동수치를 구한다.
먼저 방향을 검사하고 공원을 벗어나는지 체크한다.
공원을 안벗어난다면 for문을 돌려서 시작과 끝 사이에 X가 있는지 체크한다.
없으면 이동하고 있으면 아무일도 일어나지 않는다.
완성된 좌표를 return해준다.

내 코드

#include <string>
#include <vector>
using namespace std;

vector<int> solution(vector<string> park, vector<string> routes) {
    vector<int> answer;
    //W , H 값 구하기
    int W = park[0].length();
    int H = park.size();
    //S의 좌표 구하기
    int S_X, S_Y;
    for(int i = 0; i < W; i++)
        for(int j = 0; j < H; j++)
            if(park[i][j] == 'S')
            {
                S_X = j;
                S_Y = i;
            }
    //반복문 하기
    char op;
    int n;
    int i = 0;
    while(i < routes.size())
    {
        op = routes[i][0];
        n = routes[i][2] - '0';
        if(op == 'N')
        {
            if(S_Y - n >= 0)
            {
                bool x = false;
                for(int i = S_Y; i >= S_Y - n; i--)
                {
                    if(park[i][S_X] == 'X')
                    {
                        x = true;
                        break;
                    }
                }
                if(!x)
                    S_Y -= n;
            }
        }
        else if(op == 'S')
        {
            if(S_Y + n < H)
            {
                bool x = false;
                for(int i = S_Y; i <= S_Y + n; i++)
                {
                    if(park[i][S_X] == 'X')
                    {
                        x = true;
                        break;
                    }
                }
                if(!x)
                    S_Y += n;
            }
        }
        else if(op == 'W')
        {
            if(S_X - n >= 0)
            {
                bool x = false;
                for(int i = S_X; i >= S_X - n; i--)
                {
                    if(park[S_Y][i] == 'X')
                    {
                        x = true;
                        break;
                    }
                }
                if(!x)
                    S_X -= n;
            }
        }
        else if(op == 'E')
        {
            if(S_X + n < W)
            {
                bool x = false;
                for(int i = S_X; i <= S_X + n; i++)
                {
                    if(park[S_Y][i] == 'X')
                    {
                        x = true;
                        break;
                    }
                }
                if(!x)
                    S_X += n;
            }
        }
        i++;
    }
    answer.emplace_back(S_Y);
    answer.emplace_back(S_X);
    return answer;
}

다른 사람의 풀이

#include <bits/stdc++.h>
using namespace std;
using pi = pair<int, int>;

int dx[4] = {0, 0, 1, -1};
int dy[4] = {1, -1, 0, 0};
map<char, int> mapping = {
    {'E', 0}, {'W', 1}, {'S', 2}, {'N', 3}
};

vector<int> solution(vector<string> park, vector<string> routes) {
    int cx, cy;
    for (int i = 0; i < park.size(); ++i) {
        for (int j = 0; j < park[i].size(); ++j) {
            if (park[i][j] == 'S') {
                tie(cx, cy) = {i, j};
                break;
            }
        }
    }

    for (int i = 0; i < routes.size(); ++i) {
        int num = routes[i][2] - '0';
        int dir = mapping[routes[i][0]];

        int nx = cx, ny = cy;
        while (num--) {
            nx += dx[dir];
            ny += dy[dir];

            if (!(nx >= 0 && nx < park.size()) || !(ny >= 0 && ny < park[0].size())) break;
            if (park[nx][ny] == 'X') break;
        }

        if (num < 0) {
            cx = nx;
            cy = ny;
        }
    }
    return {cx, cy};
}

다른 사람의 풀이 해석

x방향 배열과 y방향 배열, 방향 문자에 따른 index를 담은 map을 추가해 두었다.
S좌표를 먼저 구한다.
route에 대한 for문을 돌린다.
먼저 방향과 이동 수치를 구한다. 방향은 map에 넣어서 value값을 가져온다.
이동 수치를 기반으로 while문을 돌리면서 이동한다.
범위 밖을 나가거나 가다가 X를 만날경우 이동한 값은 적용시키지 않는다.
무사히 이동했을 경우 (num < 0 ) 해당 이동을 적용시킨다.

profile
게임 개발자 지망생

0개의 댓글