자바 스캐너를 이용한 삼각형 출력과 마름모 출력에 대해서 질문드립니다.

조회수 640회
// 삼각형 스캐너

import java.util.Scanner;

public class Stars05 {
    public static void main(String[] args) {
        int line;
        Scanner input = new Scanner(System.in);

        System.out.print("How long is the line? : ");
        line = input.nextInt();

        for(int i=line, add=0; i>0; i--, add++) {
            for(int j=0; j<i-1; j++) {
                System.out.print(" ");
            }
            for(int j=0; j<line-(i-1)+add; j++) {
                System.out.print("*");
            }
            System.out.println();
        }
    }
}
// 마름모 스캐너

import java.util.Scanner;

public class Stars07 {
    public static void main(String[] args) {
        int line;
        Scanner input = new Scanner(System.in);

        System.out.print("How long is the line?(only odd-number) : ");
        line = input.nextInt();

        for(int i=line/2, add=0; i>0; i--, add++) {
            for(int j=0; j<=i-1; j++) {
                System.out.print(" ");
            }
            for(int j=0; j<line/2 - (i-1)+add; j++) {
                System.out.print("*");
            }
            System.out.println();
        }
        for(int i=0, add=line/2; i<line/2 + 1; i++, add--) {
            for(int j=0; j<i; j++) {
                System.out.print(" ");
            }
            for(int j=0; j<(line/2 + 1)-i+add; j++) {
                System.out.print("*");
            }
            System.out.println();
        }
    }
}

스캐너와 for문을 이용하여 입력한 값을 토대로 삼각형과 마름모를 출력하는 것을 만들고 싶었는데 어떻게 만들어야될지 전혀 모르겟어서 구글링을 한것을 가져와서 해석을 하려고 했으나 어떻게 해석해야될지도 잘 모르겟습니다.

이 코드를 해석하는것과 제가 원하는것을 어떻게 하면 잘 만들수 있을지 조언해주시면 감사하겠습니다. 그리고 while 문을 이용하여서 같은 방식으로 만들고 싶습니다.

1 답변

  • 입출력 같은 기능은 사용하다보면 익숙해지고 금방 찾을 수 있지만 논리과정은 직접 생각해보시는 것이 좋습니다.

    삼각형 문제에서는 삼각형을 만들기 위해서 공백과 별을 출력하는데 라인 마다 각 문자를 몇개씩 출력해야 하는지가 핵심입니다.

    해당 프로그램을 돌렸을 때의 3줄의 삼각형을 만드는 경우 예로,

    첫 줄에는 공백이 2개 별이 1개

    두번째 줄에는 공백이 1개 별이 3개

    세번째 줄에는 공백이 0개 별이 5개

    프로그램 종료

    패턴이 보인다면 똑같이 위 3줄을 n줄로 만들 때

    첫 줄에는 공백이 n-1개 별이 1개

    두번째 줄에는 공백이 n-2개 별이 3개

    세번째 줄에는 공백이 n-3개 별이 5개

    i번째 줄에는 공백이 n-i개 별이 2*i-1개

    loop (n)회 {
        loop (n-1)회
            공백문자 1개 출력;
        loop (2*i-1)회
            별문자 1개 출력;
        개행문자 출력;
    }
    

    위와 같이 패턴을 찾고 의사코드를 작성해본 후 코드 라인마다 쭉 따라가면서 값이 어떻게 변하고 무엇이 출력되는지 생각해보시기 바랍니다.


    구글링으로 가져오신 코드는 처음 배우는 단계에서 for문에서 초기화식과 증감식이 두개씩 들어가서 조금 복잡한 것 같습니다. 또한 별 갯수 계산식이 변수 두개가 얽혀 어려워졌습니다.

    제가 작성한 계산식과 같은 방식으로 별을 출력하는 부분만 바꾸면 다음과 같습니다.

    for(int j=0; j<2*add-1; j++) {
        System.out.print("*");
    }
    

    for문을 while 문으로 변경하시려면 변수 초기화를 while문 이전 단계에서 하시고 while 조건문에 for에 사용하던 조건문, 그리고 while문 내부 마지막 줄에 증감식을 적어주시면 됩니다. 아래는 예입니다.

    /* for */
    for(int i=line, add=0; i>0; i--, add++) {
        ...
    }
    /* while */
    int i=line;
    int add=0;
    while(i>0) {
        ...
        i--;
        add++;
    }
    

    위와 같이 for문을 사용하면 코드 라인 수를 줄이는데 도움이 되며 중요한 부분에 집중 할 수 있도록 도와줍니다.

    또한 for문 내부에서만 변수가 존재하기 때문에(스코프) 다른 곳에서 사용하는 경우 변수 중복 초기화 문제를 예방할 수 있습니다.

    (예로, 위 코드의 j 변수는 for문이 아니였다면 0으로 다시 초기화를 하거나 다른 변수이름을 사용해야 합니다.)

    과제 때문이 아니라면 되도록 for 문을 권장드립니다.


    추가로, 막 배우기 시작하셨다면 다른 코드를 가져와서 해석하는 것보다 직접 사용해보고 논리를 세우고 코드를 작성해보는게 훨씬 도움이 될 겁니다.

    제대로 작성된 코드는 주석도 잘 달아놓고 이름도 대표적인 이름을 사용하여 읽기 쉽지만 단순 기능 코드는 사람마다 의도가 다르기 때문에 해석이 작성보다 더 어렵습니다.

    감사합니다.

    • (•́ ✖ •̀)
      알 수 없는 사용자

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)