728x90
개요
알고리즘을 풀다보면 2차원 배열이나 그리드에서 현재 위치에서 상하좌우 + 대각선 8방향으로 이동하는 것을 구현해야할 때가 있습니다.
본 글에서는 그리드나 2차원 배열에서 현재 위치에서 8방향으로 이동하는 것을 구현하는 방법을 정리하고자 합니다.
4방향 이동 (상하좌우)
먼저 기본적인 4방향 이동을 살펴보겠습니다.
// 상하좌우 이동
static int[] dx = {-1, 1, 0, 0}; // 상하
static int[] dy = {0, 0, -1, 1}; // 좌우
// 사용 예시
for (int i = 0; i < 4; i++) {
int nextX = currentX + dx[i];
int nextY = currentY + dy[i];
// 다음 위치 (nextX, nextY)로 이동
}
각 방향의 의미는 다음과 같습니다.
- (dx[0], dy[0]) = (-1, 0) : (위로 이동, y축 변화 없음)
- (dx[1], dy[1]) = (1, 0) : (아래로 이동, y축 변화 없음)
- (dx[2], dy[2]) = (0, -1) : (왼쪽으로 이동, x축 변화 없음)
- (dx[3], dy[3]) = (0, 1) : (오른쪽으로 이동, x축 변화 없음)
8방향 이동 (상하좌우 + 대각선)
8방향 이동은 4방향에 대각선 방향을 추가한 것입니다.
// 8방향 이동 (시계 방향으로 정의)
static int[] dx = {-1, 1, 0, 0, -1, -1, 1, 1};
static int[] dy = {0, 0, -1, 1, -1, 1, -1, 1};
// 사용 예시
for (int i = 0; i < 8; i++) {
int nextX = currentX + dx[i];
int nextY = currentY + dy[i];
// 다음 위치 (nextX, nextY)로 이동
}
시계 방향으로 정의한다면 이해가 쉽습니다. 상,하,좌,우,좌상,우상,좌하,우하 순서입니다.
기본 4방향
- 상 (-1, 0): x축 -1
- 하 (1, 0): x축 +1
- 좌 (0, -1): y축 -1
- 우 (0, 1): y축 +1
대각선
- 좌상 (-1, -1): x축 -1 & y축 -1
- 우상 (-1, 1): x축 -1 & y축 +1
- 좌하 (1, -1): x축 +1 & y축 -1
- 우하 (1, 1): x축 +1 & y축 +1
4사분면으로 이해하기
2차원 배열에서 방향 이동을 이해할 때, 4사분면 좌표계를 활용하면 직관적으로 이해할 수 있습니다.
배열에서 방향 이동의 이해
2차원 배열의 이동을 이해할 때, 배열의 인덱스 구조를 활용하면 직관적입니다.
- 행(x)
- 배열의 위에서 아래로 갈수록 값이 증가합니다.
- 배열의 첫 번째 행은 0번 인덱스이며, 아래로 내려갈수록 x값이 커집니다.
- 열(y)
- 배열의 왼쪽에서 오른쪽으로 갈수록 값이 증가합니다.
- 배열의 첫 번째 열은 0번 인덱스이며, 오른쪽으로 이동할수록 y값이 커집니다.
예를 들자면:
- 위쪽(상)으로 이동하면 행(x) 값이 감소하고,
- 아래쪽(하)으로 이동하면 행(x) 값이 증가합니다.
- 오른쪽(우)으로 이동하면 열(y) 값이 증가합니다.
이처럼 2차원 배열은 행(x)과 열(y)의 이동 방향이 좌표계와 유사하게 동작하므로, 이를 활용하면 방향 이동 구현이 더 직관적입니다.