첫째 줄에는 별 1개, 둘째 줄에는 별 2개, N번째 줄에는 별 N개를 찍는 문제
하지만, 오른쪽을 기준으로 정렬한 별(예제 참고)을 출력하시오.
예제:
풀이)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
public class Main{
public static void main(String[] args){
Scanner scan = new Scanner(System.in);
int n = scan.nextInt();
for (int i = 1; i <= n; i++) {
for (int k = n; k > i; k--) {
System.out.print(" ");
}
for (int j = 0; j < i; j++) {
System.out.print("*");
}
System.out.println();
}
}
}
|
if문을 사용하는등의 다른 방법들이 있겠지만,
저는 for만을 사용 하였습니다.
Scanner 부분은 다들 이해하셨으리라 봅니다.
(마지막 scan.close()는 자원 낭비를 위해 작성함)
첫번째 for문 에 대한 설명입니다.
for(int i=1; i<=n; i++){
일단 for문의 구조는 다음과 같습니다.
for(초기식;조건식;증감식)
초기식 int i = 1,
정수 i의 시작 값은 1과 같습니다.
조건식 i <= n,
조건은 n보다 작거나 같을때
(여기서 n의 값으로 마지막 줄을 설정한 것 입니다.)
증감식 i++,
마지막으로 점점 증가하는 증감식이라는 것을 알 수 있습니다.
두번째 for문 에 대한 설명입니다.
for(int k=n; k>i; k--){
System.out.print(" ");
일단 k는 랜덤으로 주어진 변수명입니다.
* 참고로 변수명이 j 여도 밑에 반복문과 겹치지 않습니다.
초기식 k = n,
정수 k의 값은 마지막 줄을 의미하는 n의 값과 같다는 것입니다.
조건식 k > i,
k의 값은 i보다 작아야 한다는 뜻입니다.
증감식 k--;
k의 값은 점점 감소하는 증감식이라는 것을 알 수 있습니다.
그리고 System.out.print(" ");를 작성하였는데, 이것은 저 조건에 맞을때 공백을 넣어주는 것을 의미 합니다.
이것을 풀이해보면,
k의 값은 n의 값으로 시작하고,
i의 값보다 작아지기 전까지 점점 감소합니다.
* 시작부터 감소할때마다 공백을 넣어주는 것을 알 수 있습니다.
처음에 n에 5를 입력했다고 가정해봅시다.
n의 값이 5라면, 줄은 총 5줄이며
k는 5라는 값으로 시작하고, i의 시작값이었던 1보다 작아지기 전까지 계속 반복됩니다.
즉 첫번째줄에서는 5,4,3,2 라는 i보다 큰 k의 값으로 총 4번을 반복하게 되며 4개의 " "(공백)을 출력하게 되는 것입니다.
두번째 줄에서는 i의 값이 2가 됐으니 5,4,3 총 3번의 반복으로 3개의 공백을 출력하게 되겠죠?
세번째 for문 에 대한 설명입니다.
for(int j=0; j<i; j++){
System.out.print("*");
초기식 int j = 0,
정수 j의 값은 0부터 시작한다는 뜻입니다.
조건식 j < i,
j는 i보다 작을때만 작동합니다.
증감식 j++,
j는 점점 증가하는 증감식을 갖고 있습니다.
그리고 System.out.print("*");를 작성하였는데 이는 곧 조건에 맞을때 *를 출력한다는 것 입니다.
이것을 풀이 해보자면,
j는 0으로 시작하며, i보다 작을때까지 점점 증가합니다.
그리고 증가할때마다 *를 출력하겠죠?
여기서 i는 1로 시작하고 j는 0으로 시작하니 무조건 * 하나는 출력한다는 것을 알 수 있겠죠?
for문의 사이클이 시작됐다는 가정을 해봅시다.
예) for i=1; i<5; i++ 라는 사이클
처음 i의 값은 1이므로 위에 말씀드렸다 싶이 j는 0이므로 * 하나를 출력합니다.
그 다음은 i의 값이 2가 되겠죠?
그러면 j는 0에서부터 2보다 작을때까지 0, 1이라는 숫자가 있으므로 총 두개의 *를 출력합니다.
그리고 이 *는 앞에 두번째 for문이었던 for k 에서 공백이 먼저 출력됐기에 합쳐져서,
예제와 같은 결과를 얻을 수 있습니다.
자 그러면 여기서 의문인게 그렇게 되면 모든 별이 붙어있을텐데 왜 저런 계단식으로 나오나요? 라는 것일텐데,
바로 for i문이 끝나기전
System.out.println(); 를 통해 한 행이 끝나면 한줄을 뛰어주는 코드를 입력하였기 때문입니다.
이는 두번째 세번째 for문이 끝나고 그 다음 i의 값을 입력하기전에 한줄을 띄워준다는 것을 의미하지요.
https://www.acmicpc.net/problem/2439
말이 굉장히 어수선하네요ㅠ
다른 글에서 별표 출력에 관련하여 다시한번 정리해보겠습니다.
'dev > algorithm' 카테고리의 다른 글
[백준] Q.2739: 구구단 (0) | 2019.10.23 |
---|---|
[백준] Q.10171: 고양이 (0) | 2019.10.22 |
[백준] Q.10998: A * B, Q.1008 A / B (0) | 2019.10.22 |
[백준] Q.1000: A + B, Q.1001: A - B (class 오류 이유) (0) | 2019.10.22 |