DY N DY

실력키우기 대각선 지그재그(JAVA) 본문

PARK/ALGORITHM

실력키우기 대각선 지그재그(JAVA)

손세지 2016. 4. 12. 16:47

1495 : 대각선 지그재그

제한시간: 1Sec    메모리제한: 64mb
해결횟수: 974회    시도횟수: 1827회   



정사각형의 크기를 입력 받은 후 대각선으로 지그재그 형태인 다음과 같은 형태로 출력하는 프로그램을 작성하시오.


< 처리조건 > 
(1) 가장 왼쪽 위의 좌표부터 차례로 숫자를 대입시킨다. 
(2) 대각선을 기준으로 계속 지그재그 모양으로 채워져야 하며 숫자는 1씩 증가하는 형태로 채워나가야 한다.


e3050b66a1b29a01767400d7560a4131_1449726
 

 

정사각형의 크기 n(1부터 100사이의 정수)을 입력받는다.



위에서 언급한 형태의 지그재그 모양의 정사각형의 내부 숫자를 차례로 채운 후의 모습을 출력한다. 숫자 사이는 공백으로 구분한다.


 [Copy]
3
 [Copy]
1 3 4 
2 5 8 
6 7 9



 [Copy]
2
 [Copy]
1 3
2 4
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
/**************************************************************
    Problem: 1495
    User: a132034
    Language: Java
    Result: Success
    Time:220 ms
    Memory:10356 kb
****************************************************************/
 
 
import java.util.Scanner;
 
public class Main {
 @SuppressWarnings("resource")
 public static void main(String[] args) {
  Scanner sc = new Scanner(System.in);
  int N = sc.nextInt();
  int[][] map = new int[N][N];
 
  map[0][0] = 1;
  map[N-1][N-1] = N*N;
  int x = 1, y = 0;
  int c = 2;
  for(int i = 1; i < N; ++i)
  {
   map[x][y] = c++;
   for(int j = 0 ; j < i; ++j)
   {
    if(i%2 != 0)
    {
     x--;
     y++;
    }
    else
    {
     x++;
     y--;
    }
    map[x][y] = c++;
   }
   if(i%2 != 0)
    y++;
   else
    x++;
  }
  
  if(x != 0){
   x--;
   y++;
  }
  else{
   x++;
   y--;
  }
   
  for(int i = N-2; i > 0; --i)
  {
   map[x][y] = c++;
   for(int j = 0 ; j < i; ++j)
   {
    if(i%2 != 0)
    {
     x--;
     y++;
    }
    else
    {
     x++;
     y--;
    }
    map[x][y] = c++;
   }
   if(i%2 != 0)
    x++;
   else
    y++;
  }
   
   
  for(int i = 0 ; i < N; ++i)
  {
   for(int j = 0 ; j < N; ++j)
   {
    System.out.print(map[i][j]+ " ");
   }System.out.println();
  }
 }
}


배열에 먼저 값을 넣어주고 출력하는 방법을 사용했다. 

값을 넣어주는 방법은 두 가지로 나누어 대각선 ( / 방향 )으로 늘어나는 구간 (총 1개~N개까지)

과 줄어드는 구간 (N~1개 까지)로 나누었고 

각각 패턴을 그려보니 

0,0 

-> 1,0 -> 0,1

-> 0,2 -> 1,1 -> 2,0 

-> 3,0 -> 2,1 -> 1,2 -> 0,3... 

순서로 x + y의 합은 줄 번호와 같으며 시작이 X, 0 이라면 1씩 x -> y로 옮겨지며 0, X까지 이동, 반대의 경우도 같다. 

더 간단하게 풀 수 있는 방법이 있을 것 같으나 종이에 그리고 생각한대로 바로 풀었다. 

구현하다 보니 0,0번째와 n-1,n-1번째는 그냥 넣어주는게 더 편해보여서 시작할 때 값을 넣어주었다.