새소식

코딩테스트/프로그래머스

[C++] 공원 산책

  • -

[문제]

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

 

프로그래머스

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

programmers.co.kr

[문제 풀이]

빡구현 문제인데 오랜만에 빡구현 문제를 보니 생각했던 시간보다 오래 걸려서 풀게 되었다.

해당 문제에서 요구사항은

1. S의 위치 파악

2. X좌표, 가지 못하는 곳의 위치 파악

3. S를 1씩(이게 중요하다.) 움직여서 요구사항 마지막까지 따를 수 있다면 모두 따르자.

 

나는 E, S, N, W 4가지의 경우에 맞춰서 구현을 하였다.

* 만일 방향 요구가 E라면

if(route.first == '방향'){
    if(현재 좌표.가로 or 세로 + 가야 하는 숫자 < 가로 길이 or 세로 길이){
    	//도중에 'X'가 있는지 파악할 bool 변수
        bool flag = true;
        //for을 이용해서 가야하는 숫자 만큼 진행
        for(int j = 1;j<=가야 하는 숫자;j++){
        	//만일 X가 있다면 변수를 fasle로 변경
            //여기선 E라서 x좌표가 움직인다고 가정 W이면 j를 빼주자.
            //만일 N이나 S라면 y좌표를 움직이자.
            if(arr[y좌표][x좌표 + j] == 1){
                flag = false;
            }
        }
        //만일 한번도 X가 없었다면
        if(flag){
            현재좌표.x좌표 += 가야하는 숫자;
        }
    }
}

세부적인 부분을 제외하고는 해당 코드를 W, S, N의 경우에도 맞춰서 변경해서 넣어주면 코드 구현이 이루어진다.

[코드]

#include <string>
#include <vector>
#include <iostream>

using namespace std;

int arr[51][51];

//해당 함수를 통해서 string 안에 들어있는 내용을 pair 안에 first는 방향, second는 숫자로 입력시킨다.
pair<char,int> splited(string str){
    pair<char,int> answer;
    answer.first = str[0];
    answer.second = str[2] - '0';
    return answer;
}

vector<int> solution(vector<string> park, vector<string> routes) {
    vector<int> answer;
    
    //1. S위치 찾기.
    //2. X 위치 찾기.
    //3. S를 routes의 지시대로 X까지 옮기기
    
    //S의 location을 저장할 pair 변수.
    pair<int, int> locs;
    
    //공원의 가로폭과 세로폭의 한계 파악.
    int east = park[0].size();
    int south = park.size();
    
    //S의 위치를 locs에 저장, X의 위치를 arr 배열안에 1로 저장하자.
    for(int i = 0;i<park.size();i++){
        for(int j = 0;j<park[i].size();j++){
            if(park[i][j] == 'S'){
                locs.first = i;
                locs.second = j;
            }
            if(park[i][j] == 'X'){
                arr[i][j] = 1;
            }
        }
    }
    
    for(int i = 0;i<routes.size();i++){
        //routes[i]의 좌표와 숫자를 저장할 변수
        pair<char, int> route;
        route = splited(routes[i]);
    
        //만일 동쪽이면
        if(route.first == 'E'){
            if(locs.second + route.second < east){
                bool flag = true;
                for(int j = 1;j<=route.second;j++){
                    if(arr[locs.first][locs.second + j] == 1){
                        flag = false;
                    }
                }
                if(flag){
                    locs.second += route.second;
                }
            }
        }
        //북쪽이면
        else if(route.first == 'N'){
            if(locs.first - route.second >= 0){
                bool flag = true;
                for(int j = 1;j<=route.second;j++){
                    if(arr[locs.first - j][locs.second] == 1){
                        flag = false;
                    }
                }
                if(flag){
                    locs.first -= route.second;
                }                
            }
        }
        //남쪽이면
        else if(route.first == 'S'){
            if(locs.first + route.second < south){
                
                bool flag = true;
                for(int j = 1;j<=route.second;j++){
                    if(arr[locs.first + j][locs.second] == 1){
                        flag = false;
                    }
                }
                if(flag){
                    locs.first += route.second;
                }                
            }
        }
        //서쪽이면
        else if(route.first == 'W'){
            if(locs.second - route.second >= 0){
                bool flag = true;
                for(int j = 1;j<=route.second;j++){
                    if(arr[locs.first][locs.second - j] == 1){
                        flag = false;
                    }
                }
                if(flag){
                    locs.second -= route.second;
                }
            }            
        }
    }
    
    //마지막 위치를 answer에 넣어주자.
    answer.push_back(locs.first);
    answer.push_back(locs.second);
    
    return answer;
}

'코딩테스트 > 프로그래머스' 카테고리의 다른 글

[C++] 바탕화면 정리  (0) 2023.03.31
[C++] 리코쳇 로봇  (0) 2023.03.30
[C++] 아이템 줍기  (2) 2023.02.03
[C++] 단어 변환  (0) 2023.02.02
[C++] 게임 맵 최단거리  (0) 2023.02.02
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.