프로그래밍을 하다 보면 좌표와 배열을 매핑하는 작업이 필요할 때가 많습니다.
특히 2차원 배열을 다루는 알고리즘 문제에서는 좌표 (x, y)를 배열에 올바르게 맵핑하는 것이 중요합니다. 필자 또한 헷갈리는 부분이 있어 이번 글에서는 좌표와 배열의 매핑 방법을 자세히 알아보겠습니다.
좌표와 배열의 기본 개념❓
먼저 좌표와 배열의 기본 개념에 대해서 정리해 봅시다.
좌표 (x,y)
- 좌표는 공간에서 위치를 나타내기 위해 사용하는 숫자 쌍 또는 그 이상의 수의 집합입니다.
- 좌표는 일반적으로 x는 열(column), y는 행(row)를 의미합니다.
- 예를 들어 좌표 (3,4)는 x축에서 3만큼 오른쪽으로, y축에서 4만큼 위쪽으로 이동한 위치를 나타냅니다.
2차원 배열[행][열]
- 배열은 동일한 타입의 변수들을 하나의 묶음으로 저장하기 위한 자료구조입니다.
- 2차원 배열은 [행][열]순서로 접근합니다.
좌표와 배열 매핑
위에서 보았듯이 프로그래밍에서 좌표계와 배열의 차이점이 있습니다. 따라서 좌표와 배열의 구조가 다르기 때문에, 좌표 (x,y)를 배열에 올바르게 매핑하는 것이 아주 중요합니다.
예를 들어 2차원 배열은 행과열로 구성되며, 배열의 요소는 [행][열]형식으로 접근합니다. 하지만 좌표는 (x,y)형식으로 표현되며 일반적으로x는 열, y는 행을 나타냅니다.
좌표와 배열 매핑의 예
// 가로 4, 세로 3
좌표:
(0,0) (1,0) (2,0) (3,0)
(0,1) (1,1) (2,1) (3,1)
(0,2) (1,2) (2,2) (3,2)
배열:
map[0][0] map[0][1] map[0][2] map[0][3]
map[1][0] map[1][1] map[1][2] map[1][3]
map[2][0] map[2][1] map[2][2] map[2][3]
이처럼 좌표 (x,y)를 ➡️ 배열 [y][x]로 변환하여 매핑할 수 있습니다.
만약 위 그림처럼좌표가 존재할 때, 특정 좌표에는 1이 있고, 나머지 좌표에는 0이 요소로 존재합니다.
이 좌표를 그대로 배열에 매핑을 하려면 좌표 (x,y)를 ➡️ 배열 [y][x]로 변환하여 매핑해야 합니다.
잘못된 배열[x][y] 매핑 ❌
public class ArrayMappingXY {
public static void main(String[] args) {
int M = 4; // 가로 길이
int N = 4; // 세로 길이
int[][] arrayXY = new int[M][N];
// 특정 좌표에 값을 배치 (x, y 기준)
arrayXY[0][0] = 1;
arrayXY[2][0] = 1;
arrayXY[2][1] = 1;
arrayXY[2][2] = 1;
arrayXY[1][3] = 1;
arrayXY[3][3] = 1;
// 배열 출력
System.out.println("배열 [x][y]로 매핑한 결과:");
printArray(arrayXY);
}
public static void printArray(int[][] array) {
for (int x = 0; x < array.length; x++) {
for (int y = 0; y < array[x].length; y++) {
System.out.print(array[x][y] + " ");
}
System.out.println();
}
}
}
실행 결과
1 0 0 0
0 0 0 1
1 1 1 0
0 0 0 1
좌표 (x,y)를 배열[x][y]로 잘못 매핑 한 경우 배열에 원래 의도와 다르게 매핑이 된 것을 볼 수 있습니다.
올바른 배열[y][x] 매핑✅
public class ArrayMappingYX {
public static void main(String[] args) {
int M = 4; // 가로 길이
int N = 4; // 세로 길이
int[][] arrayYX = new int[N][M];
// 특정 좌표에 값을 배치 (y, x 기준)
arrayYX[0][0] = 1;
arrayYX[0][2] = 1;
arrayYX[1][2] = 1;
arrayYX[2][2] = 1;
arrayYX[3][1] = 1;
arrayYX[3][3] = 1;
// 배열 출력
System.out.println("배열 [y][x]로 매핑한 결과:");
printArray(arrayYX);
}
public static void printArray(int[][] array) {
for (int y = 0; y < array.length; y++) {
for (int x = 0; x < array[y].length; x++) {
System.out.print(array[y][x] + " ");
}
System.out.println();
}
}
}
실행결과
1 0 1 0
0 0 1 0
0 0 1 0
0 1 0 1
좌표(x,y)를 올바르게 배열[y][x]로 매핑을 할 경우 원래 의도와 똑같이 들어간 것을 볼 수 있습니다.
2차원 배열에서의 이동방향
좌표 평면에서의 사분면과 배열에서의 좌표 체계는 다르게 작동할 수 있습니다.
특히, 2차원 배열에서 일반적으로 사용하는 좌표 체계는 다음과 같습니다
- 배열의 좌표는 (0, 0)에서 시작하며, 이는 보통 배열의 왼쪽 상단 모서리를 의미합니다.
- 아래로 이동할수록 x 값이 증가하고, 오른쪽으로 이동할수록 y 값이 증가합니다.
- 왼쪽 위 (좌상단 대각선):
- x 좌표가 1 감소 (-1) y 좌표가 1 감소 (-1)
- 오른쪽 위 (우상단 대각선)
- x 좌표가 1 감소 (-1) y 좌표가 1 증가 (1)
- 왼쪽 아래 (좌하단 대각선)
- x 좌표가 1 증가 (1) y 좌표가 1 감소 (-1)
- 오른쪽 아래 (우하단 대각선)
- x 좌표가 1 증가 (1) y 좌표가 1 증가 (1)
- 위 (상)
- x 좌표가 1 감소 (-1) y 좌표는 변화 없음 (0)
- 아래 (하)
- x 좌표가 1 증가 (1) y 좌표는 변화 없음 (0)
- 왼쪽 (좌):
- x 좌표는 변화 없음 (0) y 좌표가 1 감소 (-1)
- 오른쪽 (우)
- x 좌표는 변화 없음 (0) y 좌표가 1 증가 (1)
배열을 좌표로 매핑하는 방법은 상황에 따라 달라질 수 있습니다.
어떤 방식이 더 좋은지는 문제의 성격과 데이터의 구조에 따라 다릅니다. 중요한 것은 두 가지 방식의 차이점을 이해하고, 필요한 상황에 맞게 적절한 방법을 선택하는 것입니다.
'Language > Java' 카테고리의 다른 글
[JAVA] Lombok이란 무엇일까❓(lombok 설치 방법, lombok사용법) (0) | 2024.07.20 |
---|---|
[JAVA] 람다 표현식을 활용한 정렬 기법: 오름차순과 내림차순 (1차원, 2차원) (0) | 2024.07.10 |
[Java] copyOf(), arraycopy(), copyOfRange() 메서드 알아보기 ✔ (배열 복사 메서드) (0) | 2024.06.16 |
[Java] toBinaryString(), toHexString(), toOctalString() , parseInt() 알아보기 (n진법 변환) (1) | 2024.06.09 |
[JAVA] Character.isLetter() & Character.isDigit() 메서드 알아보기 (1) | 2024.06.04 |