자바 스캐너를 이용한 삼각형 출력과 마름모 출력에 대해서 질문드립니다.
조회수 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 문을 권장드립니다.
추가로, 막 배우기 시작하셨다면 다른 코드를 가져와서 해석하는 것보다 직접 사용해보고 논리를 세우고 코드를 작성해보는게 훨씬 도움이 될 겁니다.
제대로 작성된 코드는 주석도 잘 달아놓고 이름도 대표적인 이름을 사용하여 읽기 쉽지만 단순 기능 코드는 사람마다 의도가 다르기 때문에 해석이 작성보다 더 어렵습니다.
감사합니다.
-
(•́ ✖ •̀)
알 수 없는 사용자
-
댓글 입력