Programming/Algorithm

[COS Pro 1급] Java 소용돌이 배열

Cloud Applicaiton Architect 2021. 6. 27. 19:37
반응형

[문제]

아래와 같은 x * y로 구성된 2차원 배열이 존재 할 때 

예) 3 * 3

배열의 값이 아래와 같이 배치되어 있다고 할때 

그 배열의 대각선의 합을 구하라

답은 15

 

또다른 예시로 

5 * 5

답은 73

 

[해결]

이 문제의 해결을 위한 규칙을 보면 다음과 같은 원칙이 있음

이를 간략히 표현하면 i 끝까지 증가 > j 끝까지 증가 > j 끝까지 감소 > i 끝까지 감소의 룰을 가짐

 

  • while 문을 만들고 number를 1부터 max까지 될때까지 loop 돌리고 while 내부에 i와 j를 이용해 위 4개의 룰을 for loop로 각각 진행
  • 배열에서 대각선의 값은 i와 j값이 같은 경우가 대각선이 되는 위치이니 for loop를 한 번 더 돌려 합을 구함

[프로그램 소스]

public class SpriralArray {
    public static void main(String[] args) {
        int size = 5;
        int[][] arr = new int[size][size];
        
        int num = 1;    //1부터 시작
        int max = size * size;    // max 값
        int i = 0;
        int j = 0;
        int column = size;
        int row = size - 1;

        while (num <= max) {
            for (int k = 0; k < column; k++) {
                arr[i][j] = num;
                j++; 
                num++;
            }
                
            column--;
            i++;
            j--;
            for (int k = 0; k < row; k++) {
                arr[i][j] = num;
                i++;
                num++;
            }
            
            row--;
            i--;
            j--;
            for (int k = 0; k < column; k++) {
                arr[i][j] = num;
                j--;
                num++;
            }
            
            column--;
            i--;
            j++;
            for (int k = 0; k < row; k++) {
                arr[i][j] = num;
                i--;
                num++;
            }
            
            row--;
            i++;
            j++;
        }

        for (int x = 0; x < arr.length; x++) {
            for (int y = 0; y < arr[x].length; y++) {
                System.out.print(arr[x][y] + "\t");
            }
            System.out.println();
        }
    }
}  
반응형