학습 정리/👨‍💻 PS Study

[C++] 프로그래머스 - 공원 산책

무딘붓 2023. 6. 12. 23:48

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

 

프로그래머스

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

programmers.co.kr

 

[소스 코드]

 

// 23.06.12
// https://sirius7.tistory.com/

#include <string>
#include <vector>

using namespace std;

vector<int> solution(vector<string> park, vector<string> routes) {
    vector<int> answer;
    for(int i=0;i<park.size();i++){
        for(int j=0;j<park[i].length();j++) {
            if(park[i][j]=='S'){
                answer.push_back(i);
                answer.push_back(j);                
            }
        }
    }
    
    for(string s:routes){
        string direction = s.substr(0,s.find(' '));
        int length = stoi(s.substr(s.find(' ')));
        
        int tmpy=answer[0];
        int tmpx=answer[1];
        
        int i=0;
        for(;i<length;i++){
            if(direction=="N"){
                tmpy-=1;
            } else if (direction=="S"){
                tmpy+=1;                
            } else if (direction=="W"){
                tmpx-=1;                
            } else if (direction=="E"){
                tmpx+=1;  
            }
            
            if(tmpx<0 || tmpy<0 || tmpx>=park[i].length() || tmpy>=park.size() || park[tmpy][tmpx]=='X'){
                break;              
            }
        }        
        if(i==length) {
            answer[0] = tmpy;
            answer[1] = tmpx;          
        }
    }
    
    return answer;
}

특별히 어려운 자료구조를 요구하는 문제는 아닙니다.

제가 작성한것과 같이 for문과 if문만 가지고도 시간초과 없이 풀어낼 수 있는 간단한 문제입니다.

 

string direction = s.substr(0,s.find(' ')); 과 같은 식을 이용해서 방향과 거리를 구했는데,

지금 보니까 거리가 0~9여서 굳이 substr을 사용하지 않아도 쉽게 거리를 구할 수 있는 문제네요.

 

핵심적인 부분은 산책을 하면서 장애물을 만나거나, 공원을 나가게 되는지를 확인하는 건데,

저는 방향에따라 한칸씩 이동하면서 그러한 조건을 만족하면 반복문을 탈출하게 만들어

정상적인 이동을 한 경우에만 (반복문이 끝까지 진행된 경우 == i가 0에서 이동거리만큼 커진 경우) 

이동거리를 반영하는 식으로 문제를 해결했습니다.