본문 바로가기

알고리즘

숫자 대각선 나열하기

1 2 4 7 11
3 5 8 12 16
6 9 13 17 20
10 14 18 21 23
15 19 22 24 25


이런식으로 뽑아야 하는 문제다.

처음에는 이게 무슨 패턴이 있는지 알기 힘들었다.

숫자도 더해보고, 위아래 값 비교도 해보고 하는데 일관성이 없어서

이거 파악하는 데만도 한참 걸린듯.




그러다 발견한 패턴!

아래 그림처럼 숫자가 대각선으로 증가하는 걸 알 수 있었다.

좌표로 보면,


1 : (0,0)


2: (0.1)

3: (1,0)


4: (0.2)

5: (1,1)

6: (2,0)


7: (0,3)

8: (1,2)

9: (2,1)

10: (3,0)


이렇게 되는데, 자세히 보면...


x좌표는

0

01

0123

01234

1234

234

34

4


이런식으로 바뀌고

y좌표는

0

10

210

3210

43210

4321

432

43

4


대강 이런식으로 좌표값이 바뀐다.

패턴을 발견했으니 구현이 가능할 것 같아서.. 진행해보았다.


public class Test{
    public static void main(String[] args) {       
        int xMax = 5; //가로행 최대 칸 수
       
        int test[][] = new int[xMax][xMax];
       
        int number = 1;
        int x = 0;
       
        for(int row=0; row<(xMax*2); row++){
            // x값 초기화
            if(row >= xMax){
                x = row - xMax;
            }else{
                x = 0;
            }
           
            //System.out.print("row="+row+" ");
            for(int index=0; index < row; index++){
                //System.out.print(x + " ");
                //System.out.print(row-1-x);
               
                // 값 셋팅
                test[x][row-1-x] = number++;
                System.out.println("test["+x+"]["+(row-1-x)+"]"+test[x][row-1-x]);
               
                x = x+1;
                if(x >= xMax){
                    break;
                }
            }
            System.out.println();
        }
       
       
        // 배열 값
        for(int i=0;i<xMax;i++){
            for(int j=0;j<xMax;j++){
                System.out.print(test[i][j] + " ");
            }
            System.out.println();
        }
       
    }


결과

test[0][0]1

test[0][1]2
test[1][0]3

test[0][2]4
test[1][1]5
test[2][0]6

test[0][3]7
test[1][2]8
test[2][1]9
test[3][0]10

test[0][4]11
test[1][3]12
test[2][2]13
test[3][1]14
test[4][0]15

test[1][4]16
test[2][3]17
test[3][2]18
test[4][1]19

test[2][4]20
test[3][3]21
test[4][2]22

test[3][4]23
test[4][3]24

test[4][4]25


1 2 4 7 11
3 5 8 12 16
6 9 13 17 20
10 14 18 21 23
15 19 22 24 25


x축 좌표만 구하면 y축 좌표는 대칭값이기 때문에 간단하게 구할 수 있다.

x축 좌표값을 먼저 구하고, y축 좌표는 대각선 row의 인덱스에서 x축 좌표값을 빼서 구했다.


알고리즘 공부좀 많이 해야지.. 너무 오래 걸렸다.. ㅠㅠ