240117

이슬비·2024년 3월 8일

Java

목록 보기
3/3

다차원 배열

2차원 이상의 배열을 의미한다. 배열 요소로 또 다른 배열을 가지는 배열이다.

  • 2차원 배열은 배열 요소로 1차원 배열의 참조를 가지는 배열
  • 3차원 배열은 배열 요소로 2차원 배열의 참조를 가지는 배열

2차원 배열 선언

  • 자료형[][] iArr
  • 자료형 iArr[][]
  • 자료형[] iArr[]

2차원 배열 생성

  • 자료형[][] 배열의 이름 = new 배열유형[1차원 배열 개수][1차원 배열 크기];
  • 자료형[][] 배열의 이름 = new 배열유형[1차원 배열 개수][];
  • 자료형[][] 배열의 이름 = new 배열유형 {{}, {}};
  • 자료형[][] 배열의 이름 = {{}, {}};

1차원 배열 개수 : 행 (=arr.length)
1차원 배열 크기 : 열

자료형[][] 배열의 이름 = new 배열유형[1차원 배열 개수][];의 형식으로 생성할 경우, 각각의 1차원 배열을 참조해주어야 한다.

생성과 동시에 값을 초기화할 경우, new 배열유형은 생략 가능하다.

2차원 배열의 순회

2차원 배열의 순회는 다음과 같다.

int[][] = arr = {
			{1, 2, 3, 4},
            {5, 6, 7, 8},
            {9, 10, 11, 12}
};

// 행 우선 순회
for (int r=0; r<arr.length; r++) {
	for (int c=0; c<arr[r].length; c++) {
    	System.out.print(arr[r][c] + " ");
    }
	System.out.println();
}

// 열 우선 순회
for (int c=0; c<arr[0].length; c++) {
	for (int r=0; r<arr.length; r++) {
    	System.out.print(arr[r][c] + " ");
    }
	System.out.println();
}

// 지그재그 순회
for (int r=0; r<arr.length; r++) {
	if (r % 2 == 0) {
    	for (int c=0;, c<arr[r].length; c++) {
	    	System.out.print(arr[r][c] + " ");
        }
    } else {
    	for (int c=arr[r].length-1;, c>=0; c--) {
	    	System.out.print(arr[r][c] + " ");
        }
    }
	System.out.println();
}    

2차원 배열 순회 응용

int[][] arr = new int[4][4];

int cnt = 0;
for (int r=0; r<4, r++) {
	for (int c=r; c<4, c++) {
    	arr[r][c] = ++cnt;
	}
}

// 행렬 출력하기
for (int r=0; r<4; r++) {
	for (int c=0; c<4; c++) {
    	if (arr[r][c] == 0) {
        	System.out.print("   ");
        } else {
        	System.out.printf("%3d", arr[r][c]);
		}
	}
    System.out.println();
}

int[][] arr = new int[4][4];

int cnt = 0;
for (int r=0; r<4, r++) {
	for (int c=0; c<4 - r, c++) {
    	arr[r][c] = ++cnt;
	}
}

// 행렬 출력하기
for (int r=0; r<4; r++) {
	for (int c=0; c<4; c++) {
    	if (arr[r][c] == 0) {
        	System.out.print("   ");
        } else {
        	System.out.printf("%3d", arr[r][c]);
		}
	}
    System.out.println();
}

int[][] arr = new int[4][4];

int cnt = 0;
for (int r=0; r<4, r++) {
	for (int c=3; c>=r, c--) {
    	arr[r][c] = ++cnt;
	}
}

// 행렬 출력하기
for (int r=0; r<4; r++) {
	for (int c=0; c<4; c++) {
    	if (arr[r][c] == 0) {
        	System.out.print("   ");
        } else {
        	System.out.printf("%3d", arr[r][c]);
		}
	}
    System.out.println();
}

int[][] arr = new int[4][4];

int cnt = 0;
for (int c=0; c<4, c++) {
	for (int r=c; r<4, r++) {
    	arr[r][c] = ++cnt;
	}
}

// 행렬 출력하기
for (int r=0; r<4; r++) {
	for (int c=0; c<4; c++) {
    	if (arr[r][c] == 0) {
        	System.out.print("   ");
        } else {
        	System.out.printf("%3d", arr[r][c]);
		}
	}
    System.out.println();
}

int[][] arr = new int[3][5];

int lft = 0;
int rgt = 5;

int cnt = 0
for (int r=0; r<3; r++) {
	for (int c=lft; r<rgt; r++) {
    	arr[r][c] = ++cnt;
	}
    lft++;
    rgt--;
}

// 행렬 출력하기
for (int r=0; r<arr.length; r++) {
	for (int c=0; c<arr[c].length; c++) {
    	if (arr[r][c] == 0) {
        	System.out.print("  ");
        } else {
        	System.out.printf("%2d", arr[r][c]);
		}
	}
    System.out.println();
}

int[][] arr = new int[5][5];

int lft = 0;
int rgt = 5;

int cnt = 0;
for (int r=0; r<5; r++) {
	for (int c=lft; c<rgt; c++) {
    	arr[r][c] = ++cnt;
	}
    if (r < 2) {
    	lft++;
        rgt--;
	} else {
    	lft--;
        rgt++;
	}
}

// 행렬 출력하기
for (int r=0; r<arr.length; r++) {
	for (int c=0; c<arr[c].length; c++) {
    	if (arr[r][c] == 0) {
        	System.out.print("   ");
        } else {
        	System.out.printf("%3d", arr[r][c]);
		}
	}
    System.out.println();
}

2차원 배열의 탐색

탐색을 위한 델타 배열을 다음과 같이 만들 수 있다.

  1. 4방 탐색
    // 상하좌우
    int[] dr = {-1, 1, 0, 0};
    int[] dc = {0, 0, -1, 1};
  2. 8방 탐색
    // 상하좌우, 좌상, 우상, 좌하, 우하
    int[] dr = {-1, 1, 0, 0, -1, -1, 1, 1};
    int[] dc = {0, 0, -1, 1, -1, 1, -1, 1};

2차원 배열 탐색 응용

// 다음 배열에서 1이 들어있는 칸의 상하좌우에 인접한 칸에 2를 채워 넣으시오.
int [][] arr = {
		{0, 0, 0, 0, 0},
        {0, 1, 0, 0, 0},
        {0, 0, 0, 0, 0},
        {0, 0, 0, 1, 0},
        {0, 0, 0, 0, 0}
};

int N = 5;

int[] dr = {-1, 1, 0, 0};
int[] dc = {0, 0, -1, 1};

for (int r=0; r<N; r++) {
	for (int c=0; r<N; r++) {
    	if (arr[r][c] == 1) {
        	for (int d=0; d<4; d++) {
            	int nr = r + dr[d];
                int nc = c + dc[d];
                
                if (nr >= 0 && nr < N && nc >= 0 && nc < N)
                	arr[nr][nc] = 2;
			}
		}
	}
}

// 행렬 출력하기
for (int r=0; r<N; r++) {
	for (int c=0; c<N; c++)
    	System.out.printf("%2d", arr[r][c]);
	}
    System.out.println();
}
// 다음 배열에서 1이 들어있는 칸의 상하좌우 방향으로 길이가 2인 막대를 이어 붙인다.
int [][] arr = {
		{0, 0, 0, 0, 0, 0, 0},
        {0, 0, 0, 0, 0, 0, 0},
        {0, 0, 0, 0, 0, 0, 0},
        {0, 0, 0, 1, 0, 0, 0},
        {0, 0, 0, 0, 0, 0, 0},
        {0, 0, 0, 0, 0, 0, 0},
        {0, 0, 0, 0, 0, 0, 0},
};

int N = 7;

int[] dr = {-1, 1, 0, 0};
int[] dc = {0, 0, -1, 1};

for (int r=0; r<N; r++) {
	for (int c=0; r<N; r++) {
    	if (arr[r][c] == 1) {
        	for (int d=0; d<4; d++) {
            	for (int l=2; l<=2; l++) {
                	int nr = r + dr[d] * l;
	                int nc = c + dc[d] * l;
                    
					if (nr >= 0 && nr < N && nc >= 0 && nc < N)
                		arr[nr][nc] = 2;
                }
			}
		}
	}
}

// 행렬 출력하기
for (int r=0; r<N; r++) {
	for (int c=0; c<N; c++)
    	System.out.printf("%2d", arr[r][c]);
	}
    System.out.println();
}
// 다음 배열에서 1이 들어있는 칸을 포함한 행과 열에 모두 2를 채워 넣는다. (1이 들어있는 칸은 제외)
int [][] arr = {
		{0, 0, 0, 0, 0, 0, 0},
        {0, 0, 0, 0, 0, 0, 0},
        {0, 0, 0, 0, 0, 0, 0},
        {0, 0, 0, 1, 0, 0, 0},
        {0, 0, 0, 0, 0, 0, 0},
        {0, 0, 0, 0, 0, 0, 0},
        {0, 0, 0, 0, 0, 0, 0},
};

int N = 7;

int[] dr = {-1, 1, 0, 0};
int[] dc = {0, 0, -1, 1};

for (int r=0; r<N; r++) {
	for (int c=0; r<N; r++) {
    	if (arr[r][c] == 1) {
        	for (int d=0; d<4; d++) {
            	int nr = r + dr[d];
                int nc = c + dc[d];
                
                while (nr >= 0 && nr < N && nc >= 0 && nc < N) {
                	arr[nr][nc] = 2;
                    nr += dr[d];
                    nc += dc[d];
                }
			}
		}
	}
}

// 행렬 출력하기
for (int r=0; r<N; r++) {
	for (int c=0; c<N; c++)
    	System.out.printf("%2d", arr[r][c]);
	}
    System.out.println();
}

cmd + shift + f : 자동 정렬

0개의 댓글