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축 좌표값을 빼서 구했다.
알고리즘 공부좀 많이 해야지.. 너무 오래 걸렸다.. ㅠㅠ
'알고리즘' 카테고리의 다른 글
재귀함수를 이용한 부분집합 구하기 (0) | 2020.03.12 |
---|---|
약수의 합 javascript (0) | 2017.11.09 |
제일 작은 수 제거하기 python (0) | 2017.11.09 |
최대공약수 최소공배수 javascript (0) | 2017.11.09 |