DY N DY

실력키우기 숫자삼각형(JAVA) 본문

PARK/ALGORITHM

실력키우기 숫자삼각형(JAVA)

손세지 2016. 5. 16. 15:36

1641 : 숫자삼각형

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



삼각형의 높이 n과 종류 m을 입력받은 후 다음과 같은 삼각형 형태로 출력하는 프로그램을 작성하시오.


< 처리조건 >
종류 1번의 숫자의 진행 순서는 처음에 왼쪽에서 오른쪽으로 진행 한 후 방향을 바꾸어서 이를 반복한다.


e3050b66a1b29a01767400d7560a4131_1449726
 

 

삼각형의 크기 n(n의 범위는 100 이하의 홀수)과 종류 m(m은 1부터 3사이의 정수)을 입력받는다.



위에서 언급한 3가지 종류를 입력에서 들어온 높이 n과 종류 m에 맞춰서 출력한다. 숫자사이는 공백으로 구분한다.
입력된 데이터가 주어진 범위를 벗어나면 "INPUT ERROR!"을 출력한다.


 [Copy]
7 3
 [Copy]
1
1 2
1 2 3
1 2 3 4
1 2 3
1 2
1



 [Copy]
3 2
 [Copy]
0 0 0 0 0
  1 1 1
    2


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
/**************************************************************
    Problem: 1641
    User: a132034
    Language: Java
    Result: Success
    Time:198 ms
    Memory:9396 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 M = sc.nextInt();
 
        if(N % 2 == 0 || N > 100 || N < 1){
             System.out.println("INPUT ERROR!");
             return;
         }
 
        if(M == 1){
             int k  = 0 ;
             for(int i = 1; i <= N; ++i)
             {   
                 if(i%2 == 0)
                     k += i;
 
                for(int j = 0 ; j < i; ++j)
                 {
                     if(i%2 == 0){
                         System.out.print(k-j + " ");
                     }else{
                         System.out.print(++k + " ");
                     }
                 }
                 System.out.println();
             }
         }else if(M == 2){
             int k = 0;
             for(int i = 0 ; i < N; ++i)
             {
                 for(int j = 0; j < i*2; ++j)
                     System.out.print(" ");
                 for(int j = i*2 ; j < 2*N-1; ++j)
                     System.out.print(k + " ");
                 System.out.println();
                 k++;
             }
         }else if(M == 3){
             for(int i = 0 ; i < N/2+1; ++i)
             {
                 for(int j = 1; j <= i + 1; ++j )
                 {
                     System.out.print(j + " ");
                 }
                 System.out.println();
             }
             for(int i = N/2-1; i >= 0; --i)
             {
                 for(int j = 1; j <= i + 1; ++j )
                 {
                     System.out.print(j + " ");
                 }
                 System.out.println();
             }
 
        }else{
             System.out.println("INPUT ERROR!");
             return;
         }
 
 
     }
 }


2번과 3번은 크게 어렵지 않았다. 

보자마자 바로 풀릴정도로 쉬웠는데 

1번같은 경우 수첩에 써보지 않고서는 알듯 말듯 몇번씩 생각과 다른 값이 나왔다. 

1번의 경우 

1

3 2

4 5 6

10 9 8 7

... 순서로 되는데

짝수 번째에서는 반대로 증가하게 된다. 

사실 배열같은데 넣어주어 반대로 출력하면 엄청 쉽겠다고 생각했으나, 그런 방법 말고도 바로 풀 수 있을 방법이 있겠다 싶어

더 생각해보았다. 

우선 모든 줄의 가장 큰 값은 

1 -> 3 -> 6 -> 10 순서로 라인 번호를 더해준 것과 동일하다는 것을 알았다.

>> 1  (1+2) (1+2+3) (1+2+3+4) 

이를 이용해서 짝수번째는 라인 번호를 더해 주었고, 홀수 번째는 그대로 증가시켜 주었다.