• Homework(7)

    2021. 6. 25.

    by. 와트

    ※문제. 정수 하나를 입력받아, 그 수가 양수일때만 입력된 수를 줄 수로 적용하여 다음과 같이 출력되게 하는 프로그램을 만들어보자.

    정수 입력 : 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
        public void test() {
            Scanner sc = new Scanner(System.in);
            System.out.print("정수 입력 : ");
            int num = sc.nextInt();
            
            //유효성 검사
            if(num <= 0) {
                System.out.println("양수가 아닙니다.");
                return;
            }
            
            //위 삼각형 출력
            for(int i = 0; i < num; i++) {
                for(int j = 0; j < num; j++) {
                    System.out.print('*');
                    if(i == j)
                        break;
                }
                System.out.println();
            }
            
            //아래 역삼각형 출력
            for(int i = 0; i < num - 1; i++) {
                for(int j = 0; j < num; j++) {
                    if(i >= j)
                        System.out.print(" ");
                    else
                        System.out.print('*');
                }
                System.out.println();
            }
        }
    cs


    나는 아예 위의 배열이랑 아래 배열을 나누어서 풀었다.

    위에는 오름차순으로 별을 찍기만 하면 된다.

    주의해야 하는 건 아래의 역삼각형.

    5를 입력할 때로 생각하면 열은 5를 유지하면서 별과 띄어쓰기의 수가 유동적으로 움직인다.

    if문을 이용해서 열의 값이 행의 값보다 작거나 같으면 " "를, 아닌 경우 "*"을 입력하도록 했다.

     

    더보기
    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
        //num을 입력하면 num*2 - 1 만큼의 값이 행의 수, num만큼의 값이 열의 수가 된다.
        public void answer() {
            Scanner sc = new Scanner(System.in);
            System.out.print("정수 입력 : ");
            int num = sc.nextInt();
            
            //유효성 검사
            if(num <= 0) {
                System.out.println("양수가 아닙니다.");
                return;
            }
            
            int row = num * 2 - 1;
            
            for(int i = 0; i < row; i++) {
                if(i < num) {
                    //i = 0이면 1번(j = 0), i = 1이면 2번(j = 0, 1) ... 실행
                    for(int j = 0; j <= i; j++) {
                        System.out.print("*");
                    }
                }
                else {
                    int blank = i - (num - 1); //공백의 수
                    for(int j = 0; j < num; j++) {
                        if(j < blank) 
                            System.out.print(" ");
                        else
                        System.out.print("*");
                    }
                }
                System.out.println();
            }
        }
    cs

    선생님은 for문 하나에 모두 담아 if문으로 위 아래 삼각형의 범위를 나누고 그 안에서 for문을 실행했다.

    blank라는 변수를 따로 선언해서 blank보다 열의 수가 작으면 " "을 입력한다.

     

     

    ※문제. 1) 3행4열 2차원배열 선언 및 생성  2) 0행0열부터 2행2열까지 1부터 100사이의 임의의 정수값 기록해 넣음

          0열 1열  2열       3열
    0행  값   값   값  0행 값들의 합계
    1행  값   값   값  1행 값들의 합계
    2행  값   값   값  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
        public void exercise2() {
            Random rnd = new Random();
            
            //3행4열 2차원배열 선언 및 생성
            int[][] arr = new int[3][4];
            
            //0행0열 ~ 2행2열까지 난수 입력
            for(int i = 0; i < arr.length; i++) {
                int sum = 0;
                for(int j = 0; j < arr[i].length; j++) {
                    if(j < arr[i].length -1) {
                        arr[i][j] = rnd.nextInt(100)+1;
                        sum += arr[i][j];
                    }
                    else {
                        arr[i][j] = sum;
                    }
                }
            }
            System.out.println("\t0열\t1열\t2열\t3열\t");
            
            for(int x = 0; x < arr.length; x++) {
                System.out.print(x + "행\t");
                for(int y = 0; y < arr[x].length; y++) {
                    System.out.print(arr[x][y] + "\t");
                }
                System.out.println();
            }
        }
    cs


    for문 안에서 제일 마지막 열보다 1 작을 때까지는 1~100 사이의 난수를 넣고, sum이라는 변수를 따로 만들어 같은 행의 열들을 복합대입연산자를 통해 더해줬다.

    if - else로 범위를 나누고 출력은 따로 했다. 

    템플릿을 맞추려면 그냥 따로 for문 작성하는 게 깔끔해보여서 이렇게 했는데 다른 사람들도 그렇게 생각할지는 모르겠다.

     

    더보기

     이건 앞의 문제에 더해서 4행4열짜리 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
        public void answer2() {
            Random rnd = new Random();
            int[][] arr = new int [4][4];
            
            int col0Sum = 0;
            int col1Sum = 0;
            int col2Sum = 0;
            
            for(int i = 0; i < arr.length; i++) {
                int rowSum = 0//행의 누적합 변수. 행마다 초기화되어야 한다.
                
                for(int j = 0; j < arr[i].length; j++) {
                    
                    if(i < arr.length - 1) {
                        //난수 대입 행
                        if(j < arr[i].length - 1) {
                            //난수 대입
                            arr[i][j] = rnd.nextInt(100+ 1;
                            rowSum += arr[i][j];
                            
                            switch(j) {
                            case 0 : col0Sum += arr[i][j]; break;
                            case 1 : col1Sum += arr[i][j]; break;
                            case 2 : col2Sum += arr[i][j]; break;
                            }
                        }
                        else {
                            //마지막 열. 각 행의 합 대입
                            arr[i][j] = rowSum;
                        }
                    }
                    else {
                        //마지막 행
                        switch(j) {
                        case 0 : arr[i][j] = col0Sum; break;
                        case 1 : arr[i][j] = col1Sum; break;
                        case 2 : arr[i][j] = col2Sum; break;
                        }
                    }
                    System.out.print(arr[i][j] + " ");
                }
                System.out.println();
            }
        }
    cs

    같은 행의 다른 열 값을 더하는 것은 순서대로 진행되는 값들을 더하면 되기 때문에 그렇게 어렵지 않지만,

    같은 열의 다른 행 값을 더하는 것은 순서가 없기 때문에 복잡해진다.

    0열, 1열, 2열의 총합을 담을 변수를 각각 선언해주고 switch문을 이용해 해당 열일 때의 값들을 각각 복합대입연산자로 더해준다.

    if문의 중첩에 switch에 for문까지 고루고루 들어간다... 

    언제 이걸 사용하고 이걸 사용하지 않을지, 어떤 메소드가 가장 효율적인지 생각해내고 사용하는 게 제일 어려운 것 같다.

    '혼자 있는 방 > Java' 카테고리의 다른 글

    Homework(8)  (0) 2021.06.30
    Test(1)  (0) 2021.06.28
    Homework(6)  (0) 2021.06.24
    Homework(5)  (0) 2021.06.23
    Homework(4)  (0) 2021.06.22

    댓글

Designed by Nana