-
[프로그래머스/C++] 공원 산책C++ 문제 풀이/프로그래머스 2023. 6. 24. 20:59
문제 이름 : 공원 산책
1. 문제 설명
2. 푸는 방식
이 문제를 푸는 방식은 여러가지가 있지만 switch 문을 사용해서 동서남북 방향에 대응하는 예외처리를 하는 방법이 있다. 하지만 이런 방식은 너무 코드가 길어지고 여러번 예외처리를 해야하는 단점이 있다. 그리고 4가지 방향 이외에 방향이 추가되면 대응하지 못한다는 단점이 있다. 그래서 map을 이용하여 동서남북에 대한 방향 벡터를 value로 설정해주었다.
3. Solution
#include <string> #include <vector> #include <map> using namespace std; vector<int> solution(vector<string> park, vector<string> routes) { vector<int> answer; int i,j; map<char, vector<int>> dirMap; //Map 방향 벡터 초기화 dirMap['E'] = {0, 1}; dirMap['W'] = {0, -1}; dirMap['N'] = {-1, 0}; dirMap['S'] = {1, 0}; //초기 위치 설정 for(i=0;i<park.size();i++){ if(park[i].find('S') != string::npos){ answer.push_back(i); answer.push_back(park[i].find('S')); break; } } for(i=0;i<routes.size();i++){ int distance = routes[i][2] - '0'; vector<int> resTemp = {answer[0], answer[1]}; for(j=0;j<distance;j++){ resTemp[0] += dirMap[routes[i][0]].front(); resTemp[1] += dirMap[routes[i][0]].back(); //공원 밖으로 나가는 경우 검사 if(resTemp[0] < 0 || resTemp[0] >= park.size() || resTemp[1] < 0 || resTemp[1] >= park[resTemp[0]].length()) break; //장애물이 있는 경우 검사 else if(park[resTemp[0]][resTemp[1]] == 'X') break; } if(j==distance) answer = resTemp; } return answer; }
이번 문제는 각 동서남북 즉 EWSN에 대한 방향벡터를 초기화 해주고 park를 for문으로 돌면서 S를 찾으면 해당 위치를 초기위치로 설정한다. 그리고 명령을 for문으로 순회하며 명령을 수행하는데 routes의 0번째 인덱스가 방향이고 2번째 인덱스가 이동하는 양이다. routes가 string이기 때문에 string - '0' 을 하면 int로 형변환이 가능하다. 그리고 이동하는 거리인 distance만큼 for문을 돌려서 한칸 한칸 움직이게 되는데 이때 방향 벡터를 넣어둔 map에 routes의 0번째 인덱스를 Key값으로 넣어줘서 해당방향으로 벡터를 더해준다. 이때 C++에서 Vector는 +연산자가 정의되어 있지 않기 때문에 x와 y를 나눠서 더해줘야 한다. 그리고 공원 밖으로 나가는 경우와 장애물이 있는 경우를 검사하고 for문을 전부 다돌았으면 break를 만나지 않은 것이므로 answer에 명령을 수행한 결과를 넣어준다.
4. Review
이 문제는 푸는 과정에서 오류와 버그가 정말 많은 문제였는데 그 이유는 Vector 연산자에 대한 이해와 어디까지 C++이 연산을 해주는지를 잘 몰라서 오류가 많았다. 버그는 x와 y포지션이 보통은 (x, y)로 정의되는데 이 문제는 (y, x)로 정의되기 때문에 이것이 헷갈려서 버그가 많았다.
GitHub - leejy811/AlgorithmStudy: 코딩 테스트 스터디
코딩 테스트 스터디. Contribute to leejy811/AlgorithmStudy development by creating an account on GitHub.
github.com
'C++ 문제 풀이 > 프로그래머스' 카테고리의 다른 글
[프로그래머스/C++] 자릿수 더하기 (0) 2023.07.04 [프로그래머스/C++] 약수의 합 (0) 2023.07.02 [프로그래머스/C++] 바탕화면 정리 (0) 2023.06.27 [프로그래머스/C++] 추억 점수 (0) 2023.06.22 [프로그래머스/C++] 달리기 경주 (0) 2023.06.20