DY N DY

실력키우기 달팽이삼각형(JAVA) 본문

PARK/ALGORITHM

실력키우기 달팽이삼각형(JAVA)

손세지 2016. 5. 17. 12:59

1337 : 달팽이삼각형

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



삼각형의 높이 N을 입력받아서 아래와 같이 숫자 0부터 달팽이 모양으로 차례대로 채워진 삼각형을 출력하는 프로그램을 작성하시오.


< 처리조건 > 
왼쪽 위부터 시계방향으로 오른쪽 아래로 이동하면서 숫자 0부터 N개를 채우고 다시 왼쪽으로, 다음은 위쪽으로 반복하면서 채워 나간다. (숫자 9 다음에는 0부터 다시 시작한다.)


e3050b66a1b29a01767400d7560a4131_1449726 

 

마름모의 한변의 길이 N(N의 범위는 100 이하의 양의 정수)을 입력받는다.



주어진 형태대로 높이가 N인 달팽이 삼각형을 출력한다. 숫자 사이는 한 개의 공백으로 구분한다.


 [Copy]
6
 [Copy]
0
4 1
3 5 2
2 0 6 3
1 9 8 7 4
0 9 8 7 6 5
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
/**************************************************************
    Problem: 1337
    User: a132034
    Language: Java
    Result: Success
    Time:227 ms
    Memory:9700 kb
****************************************************************/
 
 
import java.util.Scanner;
 
public class Main{
     public static void main(String[] args) {
         Scanner sc = new Scanner(System.in);
         int N = sc.nextInt();
 
        int [][] arr = new int[N][N];
         int x = -1 , y = -1;
         int num = 0;
         for(int i = 0 ; i < N; ++i)
         {
             for(int j = i; j < N; ++j)
             {
                 if(i%3 == 0)
                 {
                     x++; y++;
                 }else if(i%3 == 1)
                 {
                     y--;
                 }else if(i%3 == 2)
                 {
                     x--;
                 }
                 arr[x][y] = (num++)%10;
             }
         }
 
 
         for(int i = 0; i < N; ++i)
         {
             for(int j = 0; j < i+1; ++j)
             {
                 System.out.print(arr[i][j]+ " ");
             }System.out.println();
         }
 
    }
 }


처음 딱 보자마자.. 순서대로 출력으로 할지, 계속 위치를 바꾸어가며 할지 고민했는데, 한 5분 보다보니 이건 아무리 생각해도 뭔가 순서대로는 규칙이 보이지 않아서 결국 위치를 바꾸어가며 배열에 넣고, 순서대로 출력하였다. 


방향에 따라 좌표를 노트에 써 보니 (6 기준)

0,0 -> 1,1 -> 2,2 -> 3,3 -> 4,4 -> 5,5 (대각선 내려가는 방향)

5,4 -> 5,3 -> 5,2 -> 5,1 -> 5,0          (밑변)

4,0 -> 3,0 -> 2,0 -> 1,0                   (높이) 

순서로 반복되는 것이 보였다. 

반복되는 숫자는 계속 1씩 감소하였기 때문에 두번째 for loop에서 j가 i부터 시작하게 하도록 만들었다.


그리고 대각선 -> 밑변 -> 높이가 반복되므로 3으로 나눈 나머지에 따라 좌표의 이동을 하도록 만들었는데

대각선은 둘다 +1  , 밑변은 y만 -1 , 높이는 x만 -1 되도록 하였다. 

'PARK > ALGORITHM' 카테고리의 다른 글

실력키우기 카드게임(C++)  (0) 2016.05.22
실력키우기 빙고(C++)  (0) 2016.05.21
실력키우기 파스칼삼각형(JAVA)  (0) 2016.05.16
실력키우기 숫자삼각형(JAVA)  (0) 2016.05.16
알고리즘 좋은수열(C++)  (0) 2016.05.16