Computer >> 컴퓨터 >  >> 프로그래밍 >> Java

자바(Java)로 행렬의 경계(테두리) 요소 출력하기 – 코드 예제와 알고리즘 완전 정리

이 글에서는 자바(Java)를 이용해 행렬(Matrix)의 경계 요소(Boundary Elements)를 출력하는 방법을 단계별로 살펴봅니다.

행렬의 경계 요소란?

행렬은 데이터를 행(Row)열(Column) 형태로 배치한 2차원 자료구조입니다. 그중 경계 요소란 상·하·좌·우 네 방향이 모두 다른 요소로 둘러싸여 있지 않은, 즉 행렬의 가장자리에 위치한 요소를 의미합니다.

구체적으로 다음 네 곳에 있는 요소들이 경계 요소에 해당합니다.

  • 첫 번째 행의 모든 요소
  • 마지막 행의 모든 요소
  • 첫 번째 열의 모든 요소
  • 마지막 열의 모든 요소

입력 및 출력 예시

입력 행렬:

9 8 9 8
8 7 8 7
7 6 7 6
6 5 6 5

기대 출력 결과:

9 8 9 8
8     7
7     6
6 5 6 5

출력을 보면 내부 요소(가운데 부분)는 공백으로 대체되고, 테두리에 해당하는 값만 그대로 유지되는 것을 확인할 수 있습니다.

알고리즘

Step 1 - 시작(START)
Step 2 - 정수형 행렬 input_matrix와 BoundaryElements 클래스 객체 border_values를 선언한다.
Step 3 - 행렬 값을 정의한다.
Step 4 - 두 개의 for 반복문으로 행렬의 모든 요소를 순회하며, 논리 OR(||) 조건으로 해당 요소가 경계 요소인지 판별한다.
Step 5 - 경계 요소를 화면에 출력한다.
Step 6 - 종료(STOP)

핵심 조건식은 다음과 같습니다.

x == 0 || y == 0 || x == 행렬의 행 개수 - 1 || y == 행렬의 열 개수 - 1

즉, 현재 인덱스가 첫 번째 행, 첫 번째 열, 마지막 행, 마지막 열 중 하나라도 해당하면 경계 요소로 판단합니다.

예제 1: main 메서드에서 직접 처리하기

첫 번째 예제는 행렬을 미리 정의하고, main 메서드 안에서 직접 전체 행렬과 경계 요소를 출력합니다.

public class BoundaryElements {
    public static void main(String[] args) {
        int input_matrix[][] = new int[][] {
            { 9, 8, 9, 8 },
            { 8, 7, 8, 7 },
            { 7, 6, 7, 6 },
            { 6, 5, 6, 5 }
        };
        System.out.println("정의된 행렬:");
        for (int x = 0; x < input_matrix.length; x++) {
            for (int y = 0; y < input_matrix[x].length; y++) {
                System.out.print(input_matrix[x][y] + " ");
            }
            System.out.println();
        }
        System.out.println("행렬의 경계 요소:");
        for (int x = 0; x < input_matrix.length; x++) {
            for (int y = 0; y < input_matrix[x].length; y++) {
                if (x == 0 || y == 0 || x == input_matrix.length - 1
                    || y == input_matrix[x].length - 1) {
                    System.out.print(input_matrix[x][y] + " ");
                } else {
                    System.out.print(" ");
                }
            }
            System.out.println();
        }
    }
}

실행 결과

정의된 행렬:
9 8 9 8
8 7 8 7
7 6 7 6
6 5 6 5
행렬의 경계 요소:
9 8 9 8
8 7
7 6
6 5 6 5

예제 2: 별도의 메서드로 분리하기

두 번째 예제는 로직을 별도의 메서드 Boundary_Elements()로 분리하여 재사용성을 높인 버전입니다. 객체를 생성한 뒤 행렬을 인자로 전달해 호출하는 구조입니다.

public class BoundryElements {
    public void Boundary_Elements(int input_matrix[][]) {
        System.out.println("정의된 행렬:");
        for (int x = 0; x < input_matrix.length; x++) {
            for (int y = 0; y < input_matrix[x].length; y++) {
                System.out.print(input_matrix[x][y] + " ");
            }
            System.out.println();
        }
        System.out.println("행렬의 경계 요소:");
        for (int x = 0; x < input_matrix.length; x++) {
            for (int y = 0; y < input_matrix[x].length; y++) {
                if (x == 0 || y == 0 || x == input_matrix.length - 1
                    || y == input_matrix[x].length - 1) {
                    System.out.print(input_matrix[x][y] + " ");
                } else {
                    System.out.print(" ");
                }
            }
            System.out.println();
        }
    }
    public static void main(String[] args) {
        int input_matrix[][] = new int[][] {
            { 9, 8, 9, 8 },
            { 8, 7, 8, 7 },
            { 7, 6, 7, 6 },
            { 6, 5, 6, 5 }
        };
        BoundryElements border_values = new BoundryElements();
        border_values.Boundary_Elements(input_matrix);
    }
}

실행 결과

정의된 행렬:
9 8 9 8
8 7 8 7
7 6 7 6
6 5 6 5
행렬의 경계 요소:
9 8 9 8
8     7
7     6
6 5 6 5

정리

행렬의 경계 요소 출력은 이중 반복문과 간단한 인덱스 비교 조건만으로 구현할 수 있습니다. 시간 복잡도는 행렬의 크기를 N×M이라 할 때 O(N×M)으로, 모든 요소를 한 번씩만 검사하면 되므로 매우 효율적입니다. 이 기법은 나선형(spiral) 순회나 행렬 회전 등 다양한 2차원 배열 문제의 기초가 되므로 꼭 익혀두시길 바랍니다.