본문 바로가기

알고리즘 문제풀이

[Programmers] 프로그래머스 Lv.1 공원산책 문제풀이(C++)

반응형

단순 구현문제 / 코드가 길어지고 더러워지는 경향이 있었음

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
#include <string>
#include <vector>
#include <sstream>
 
using namespace std;
/*
<문제>
로봇강아지가 산책함 - O가 지나다니는 길, X가 장애물
"E 5" 형태로 주어짐(동쪽으로 5칸)
공원을 벗어나거나, 장애물을 만나면 해당 명령 무시
가로 W, 세로 H일 때 좌측상단 (0, 0), 우측하단 (H-1, W-1)
모든 명령 수행 후 놓인 위치를 (세로좌표, 가로좌표) 순으로 배열애 담아 return
 
park길이 <=50
park[i]길이 <=50
 
*/
vector<int> solution(vector<string> park, vector<string> routes) {
    vector<int> answer;
 
    int x, y;   //현재 좌표(세로, 가로)
    for (int i = 0; i < park.size(); i++) {
        bool flag = false;
        for (int j = 0; j < park[i].size(); j++) {
            if (park[i][j] == 'S') {
                flag = true;
                x = i; y = j; break;
            }
            if (flag)break;
        }
    }
    //현재좌표 x, y(세로, 가로) 저장완료
 
    for (int i = 0; i < routes.size(); i++) { //경로 리스트 순회
        stringstream ss(routes[i]);
        string way, tmp; int distance;
        getline(ss, way, ' '); getline(ss, tmp, '\n'); distance = stoi(tmp);
        //방향, 거리 저장 완료
        int garo = park[0].size(), sero = park.size();  //가로세로 길이
 
        if (way.compare("E"== 0) {    //동
            if ((y + distance) >= garo) continue//벽 거르기
            bool flag = true//명령수행가능여부
 
            for (int j = 1; j <= distance; j++) {  //해당 방향 나아가며 장애물 확인
                if (park[x][y + j] == 'X') {
                    flag = false;
                    break;
                }
            }
 
            if (flag) {   //이동가능할 때
                y += distance;
            }
 
        }
        else if (way.compare("W"== 0) {   //서
 
            if ((y - distance) < 0continue//벽 거르기
            bool flag = true//명령수행가능여부
 
            for (int j = 1; j <= distance; j++) {  //해당 방향 나아가며 장애물 확인
                if (park[x][y - j] == 'X') {
                    flag = false;
                    break;
                }
            }
 
            if (flag) {   //이동가능할 때
                y -= distance;
            }
 
        }
        else if (way.compare("S"== 0) {   //남
            if ((x + distance) >= sero) continue//벽 거르기
            bool flag = true//명령수행가능여부
 
            for (int j = 1; j <= distance; j++) {  //해당 방향 나아가며 장애물 확인
                if (park[x + j][y] == 'X') {
                    flag = false;
                    break;
                }
            }
 
            if (flag) {   //이동가능할 때
                x += distance;
            }
        }
        else if (way.compare("N"== 0) {   //북
            if ((x - distance) < 0continue//벽 거르기
            bool flag = true//명령수행가능여부
 
            for (int j = 1; j <= distance; j++) {  //해당 방향 나아가며 장애물 확인
                if (park[x - j][y] == 'X') {
                    flag = false;
                    break;
                }
            }
 
            if (flag) {   //이동가능할 때
                x -= distance;
            }
        }
 
    }
    answer.push_back(x); answer.push_back(y);
    return answer;
}
cs
반응형