[JAVA][정올 1641] 숫자삼각형

SHORTCUT

    반응형
    사이트명 정올
    문제 링크 jungol.co.kr/bbs/board.php?bo_table=pbank&wr_id=914&sca=2020
    주요 알고리즘 #for #구현
    사용 언어 Java
    설명이 장황합니다.. 도움되는 것만 파악하세요 :-)

    1. 문제

     

    2. 입력 / 출력

     


    3. 풀이

    3-1. 생각 노트

    2번과 3번의 경우, 시작 점이 어디인지를 파악하고 그 후에 몇 회 실행시키는지를 결정한다.

    둘다 시작점이 (0,0) -> (1,1) -> (2,2) -> ... 이고, 그 때를 기준으로 5회 -> 3회 -> 1회 식으로 줄어든다.

    이걸 카운트하기 위해, for문 안에 int c를 선언해서 사용한다.

     

    3-2. 변수명

    type 변수명 설명
    int[][] arr 결과값을 넣는 배열 -> 나중에 출력해서 최종 정답
    int j for문 내에서 배열 위치를 이동하기 위한 변수
    int c 횟수 카운트용 변수

     

    3-3. 코드 보기

    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();
     
            // n 홀수, 1 <= n <=99, 1 <= m <= 3 외 전부 에러 처리
            if (n % 2 == 0 || n < 1 || n >= 100 || m < 1 || m > 3) {
                System.out.println("INPUT ERROR!");
                return;
            }
     
            int[][] arr = new int[n][n];
            int cnt = 1;
     
            switch (m) {
            case 1:
                for (int i = 0; i < n; i++) {
                    if (i % 2 == 1) { // 홀수
                        for (int j = i; j >= 0; j--) {
                            arr[i][j] = cnt++;
                        }
                    } else { // 짝수
                        for (int j = 0; j <= i; j++) {
                            arr[i][j] = cnt++;
                        }
                    }
                }
                break;
     
            case 2:
                int until = n + n / 2 * 2;
                arr = new int[n][until];
                 
                for (int i = 0; i < n; i++) {
                    for (int j = i, c = 1; c <= until; j++, c++) {   // c : 횟수로 처리하기 위함
                        arr[i][j] = i;
                    }
                    until -= 2;
                }
                break;
                 
            case 3:
                int until2 = n;
                arr = new int[n][n - n/2];
                 
                for (int j = 0; j < n - n/2; j++) {
                    for (int i = j, c = 1; c <= until2; i++, c++) {  // c : 횟수로 처리하기 위함
                        arr[i][j] = j+1;
                    }
                    until2 -= 2;
                }
                break;
     
            }// end-switch
     
     
            for (int i = 0; i < arr.length; i++) {
                for (int j = 0; j < arr[i].length; j++) {
                     
                    if(m == 2 && i == 0) {
                        System.out.print(arr[i][j] + " ");
                        continue;
                         
                    }else {
                        if (arr[i][j] == 0) {
                            System.out.print(" " + " ");
                            continue;
                        }                   
                    }
                     
                    System.out.print(arr[i][j] + " ");
                }
                System.out.println();
            }
     
        }
     
    }

     

    3-4. 마무리

    int[][] 의 경우 기본적으로 0으로 초기화 되어 있는데, 결과값에선 공백으로 나와있다..

    그리고 특이하게 2번 케이스에서만 0을 출력한다.. 쉽게 생각했는데, 은근히 까다로웠다.. 이거 처리하는게 좀 귀찮았다.

     

    일단 배열에 순서대로 수를 넣고, 그걸 출력하는 형식으로 코딩했다.

    근데 다른 문제 힌트를 보다가, "아! 배열에 넣고, 출력 순서만 바꿔도 되겠구나?" 하는 생각이 들었다.

     

    나중에 다른 분 코드 참고해서 수정해봐야겠다..!

     

    반응형

    댓글

    Designed by JB FACTORY