백준 2439번 - 별 찍기-2
백준 2439번 - 별 찍기-2
오늘은 백준 2439번의 풀이에 대해서 설명해보겠습니다. 부족한 부분이 보이시거나
더 간단한 코드에 대한 지적은 언제나 환영입니다!
우선 문제에는
첫째 줄에는 별 1개, 둘째 줄에는 별 2개, N번째 줄에는 별 N개를 찍는 문제
하지만, 오른쪽을 기준으로 정렬한 별(예제 참고)을 출력하시오.
라고 설명이 나와있습니다.
입력과 출력 예제는
//입력
5
//출력
*
**
***
****
*****
위 그림처럼 입력한 값에 따라 반쪽짜리 트리를 세워놓은 모양으로 출력해야합니다.
우선 소스 코드를 보여드린 후 설명하겠습니다.
package backUp;
import java.util.Scanner;
/**
*
* @author lucky
*
*/
public class BackJun2439 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);//입력받는 스캐너 선언
int a =sc.nextInt();// 출력할 줄 수 입력
int b = a;// 공백 출력의 for문 범위를 잡아주기 위한 변수
for (int i = 0; i < a; i++) {// 출력횟수에 따라 실행.. == 줄 수만큼 실행
for (int j = b; j > 1; j--) {// 공백 먼저입력
System.out.print(" ");
}
for (int j = 0; j <= i; j++) {// 별 입력
System.out.print("*");
}
b--;// 한 줄 찍을 때마다 공백찍는 횟수를 1번씩 줄인다.
System.out.println();
}
}
}
우선 문제를 먼저 보면 N번째 줄에 별 N개를 입력하라고 되어있습니다.
따라서 줄 당 총 글자 수는 공백이 있는줄도 모두 N개입니다.
그 점을 먼저 알아내셨다면 줄 수를 조절하는 반복문과 그 안에 별을 찍는 반복문과 공백을 찍는 반복문이 있어야한다고 생각했습니다. 이제부터 설명드리겠습니다.
for (int i = 0; i < a; i++) {// 출력횟수에 따라 실행.. == 줄 수만큼 실행}
소스코드 맨 위에 들어가는 반복문입니다. 스캐너를 통해 줄 수 N을 입력받으면 그것을 변수 a에 초기화합니다. 이후 N번만큼 실행하여 줄 수를 조절하는 반복문이라 할 수 있습니다.
이렇게 줄수를 조절하는 반복문을 만들고, 별을 찍는 반복문과, 공백을 찍는 반복문 중 무엇을 먼저 실행해야할까요?
//입력
5
//출력
*
**
***
****
*****
출력 예시를 보면 첫 줄에 공백이 먼저 나오는 것을 확인 할 수 있습니다.
따라서 공백에 대한 반복문을 먼저 작성하여 넣겠습니다.
int a =sc.nextInt();// 출력할 줄 수 입력
int b = a;// 공백 출력의 for문 범위를 잡아주기 위한 변수
for (int i = 0; i < a; i++) {// 출력횟수에 따라 실행.. == 줄 수만큼 실행
for (int j = b; j > 1; j--) {// 공백 먼저입력
System.out.print(" ");
}
b--;// 한 줄 찍을 때마다 공백찍는 횟수를 1번씩 줄인다.
}
공백에 대한 for문을 살펴보면 5가 입력됬을 때 변수 b == j == 5가 됩니다.
한번 반복될 때마다 -1씩되고, b가 2일때까지 총 4번의 공백을 출력합니다. 이후에는 1줄을 찍을때 마다
1번씩 줄어들어 3번,2번,1번 마지막엔 0번을 출력하겠죠?
그럼 제대로 찍히는지 공백대신 1의 숫자를 넣어보겠습니다.
이렇게 원하는대로 출력되는 것을 알 수 있습니다.
이제 별만 덧붙여 출력해주면 됩니다. 별은 공백과 반대로 첫번째 줄은 1개부터 줄당 1개씩 증가시키면 되겠습니다.
for (int j = 0; j <= i; j++) {// 별 입력
System.out.print("*");
}
두 번째 조건은 마지막 줄의 출력은 별의 수와 줄수가 같아야하기때문에 j(별을 찍어야하는 횟수)<=i(줄의 수) 로 표기한 것입니다. 이것을 줄을 출력하는 반복문의 마지막 부분에 넣어주면 됩니다. 이것은 한 줄을 찍을때마다(제일 위의 반복문이 한바퀴 돌때마다) j는 1씩 증가하므로 한줄마다 별은 1개씩늘어난다고 생각하시면됩니다.
이제 다시한번 전체 소스코드를 보겠습니다.
package backUp;
import java.util.Scanner;
/**
*
* @author lucky
*
*/
public class BackJun2439 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);//입력받는 스캐너 선언
int a =sc.nextInt();// 출력할 줄 수 입력
int b = a;// 공백 출력의 for문 범위를 잡아주기 위한 변수
for (int i = 0; i < a; i++) {// 출력횟수에 따라 실행.. == 줄 수만큼 실행
for (int j = b; j > 1; j--) {// 공백 먼저입력
System.out.print(" ");
}
for (int j = 0; j <= i; j++) {// 별 입력
System.out.print("*");
}
b--;// 한 줄 찍을 때마다 공백찍는 횟수를 1번씩 줄인다.
System.out.println();// == enter
}
}
}
이제 한 줄을 출력하는 반복문이 실행되면, 공백이 먼저 출력됩니다. 이후 줄 갯수 - 공백만큼 별을 찍은 뒤에
공백 출력 횟수를 하나 줄여줍니다.(b--;) 그렇게 한줄의 출력이 끝나면 println()으로 한줄을 띄워줍니다(enter키처럼)
그 과정이 반복되면 출력 예시와 같은 결과가 나오게됩니다.
긴 글 읽어주셔서 감사합니다.