반응형
개요
현재 위치 기준으로 상하좌우로 움직이는 것을 편하게 만들어 주는 배열을 만들어 놓고 재사용 한다.
만약 4방향 배열을 탐색할때 현재 위치가 배열의 가장자리라면 일부 방향으로의 탐색은 out of range 에러를 노출 하거나, 배열과 전혀 다른 메모리를 참조할 수 있으므로 if문을 통해 적절히 범위를 제한해 주어야 한다.
장점
- 불필요한 if문을 남발할 필요가 없다.
- 코드를 간결하게 표현할 수 있어 가독성이 좋다.
- 유지 보수 하기 쉽다.
적용
4방향 배열1
int dy[] = { -1, 1, 0, 0 };
int dx[] = { 0, 0, -1, 1 };
4방향 배열 탐색 로직1
int main() {
vector<vector<int>> lst = {
{1, 2, 3},
{4, 5, 6},
{7, 7, 7}
};
int sum = 0;
int x, y;
cin >> x >> y;
for (int i = 0; i < 4; i++) {
int ny = y + dy[i];
int nx = x + dx[i];
if (0 <= nx && nx < 3 && 0 <= ny && ny < 3) sum += lst[nx][ny];
}
cout << sum;
}
4방향 배열2
vector<pair<int, int>> dist1 = { {-1, 0}, {0, -1}, {0, 1}, {1, 0} };
4방향 배열 탐색 로직2
int main() {
vector<vector<int>> lst = {
{1, 2, 3},
{4, 5, 6},
{7, 7, 7}
};
int sum = 0;
int x, y;
cin >> x >> y;
for (auto d : dist1) {
int nx = x + d.first, ny = y + d.second;
if (0 <= nx && nx < 3 && 0 <= ny && ny < 3) sum += lst[nx][ny];
}
cout << sum;
}
8방향 배열
vector<pair<int, int>> dist2 = { {-1, -1}, {-1, 0}, {-1, 1}, {0, -1}, {0, 1}, {1, -1}, {1, 0}, {1, 1} };
탐색 로직
int main() {
vector<vector<int>> lst = {
{1, 2, 3},
{4, 5, 6},
{7, 7, 7}
};
int sum = 0;
int x, y;
cin >> x >> y;
for (auto d : dist2) {
int nx = x + d.first, ny = y + d.second;
if (0 <= nx && nx < 3 && 0 <= ny && ny < 3) sum += lst[nx][ny];
}
cout << sum;
}
예제 코드에서는 벡터의 범위를 3으로 고정했지만 N * M 크기의 배열에서도 사용이 가능하며 if문에서 3 대신 N과 M 변수를 적절히 대입해 주면 된다.
728x90
반응형
'알고리즘 공부 > 알고리즘' 카테고리의 다른 글
그리디 알고리즘 Greedy Algorithm C++ (0) | 2024.07.25 |
---|---|
정렬 Sort C++ (0) | 2024.07.25 |
문자열 String C++ (2) | 2024.07.24 |
벡터 Vector C++ (2) | 2024.07.23 |
DAT (Direct Access Table) 배열 활용법 (1) | 2024.07.22 |