지도(그래프)에서 동서남북으로 움직이는 문제는 자주 출제되는 문제유형인 것 같다.
2차원 배열에서 상하좌우로 1칸씩 움직일 수 있고 배열의 범위를 초과하는 것을 다뤄야 할 경우가 많다.
그래서 2차원 배열 동서남북 움직이기를 템플릿으로 만들어 두면 좋을 것 같다.
다음은 R, L, U, D를 입력 받아 동서남북으로 움직이는 전형적인 문제의 답안이다.
움직이는 좌표를 설정하고 공간을 벗어나는 경우를 continue로 무시하여 깔끔하게 코드를 작성하는 법이라 생각한다.
#include <iostream>
#include <vector>
using namespace std;
int r = 1, c = 1;
int n;
string plans;
// 동, 서, 남, 북 방향
int dr[4] = {0, 0, 1, -1};
int dc[4] = {1, -1, 0, 0};
char move_types[4] = {'R', 'L', 'D', 'U'};
int main(void) {
cin >> n;
cin.ignore();
getline(cin, plans);
// 이동 계획을 하나씩 확인
for (int i = 0; i < plans.size(); i++) {
char plan = plans[i];
// 이동 후 좌표 구하기
int tr = r, tc = c;
for (int j = 0; j < 4; j++) {
if (plan == move_types[j]) {
tr += dr[j];
tc += dc[j];
}
}
// 공간을 벗어나는 경우 무시
if (tr < 1 || tr > n || tc < 1 || tc > n) {
continue;
}
r = tr;
c = tc;
}
cout << r << " " << c << "\n";
return 0;
}
'알고리즘 > Template' 카테고리의 다른 글
[Algorithm][Template] 이진 탐색, 파라메트릭 서치 (0) | 2022.03.11 |
---|---|
[Algorithm][Template] DFS와 BFS (0) | 2022.02.05 |
[Algorithm][Template] 순열과 조합 (0) | 2022.01.22 |
[Algorithm][Template] Prefix Sum, 구간 합 계산 (0) | 2022.01.20 |
[Algorithm][Template] 투 포인터 (0) | 2022.01.20 |