본문 바로가기

study/baekJun

[백준/자바/JAVA/for문/별찍기]백준2438, 백준2439

출처 : https://www.acmicpc.net/problem/2438

이번에는 for문을 사용하여 *을 찍어내는 문제이다.

1학년 때 과제를 받았을 때는 하루를 고민해도 혼자 풀 수 없었는데

이제는 십분만 고민해봐도 답이 나오는 걸 보니 일학년 때 공부를 안한게 티가 났다 ㅎㅎ;

일단 bufferedWrite를 사용할 것이고,

이중 for문을 돌릴 것이다.

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

public class qn2438{
   public static void main(String[] args) throws IOException{
      BufferedReader bf = new BufferedReader(new InputStreamReader(System.in)); //콘솔에서 입력받을 경우
      BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
      
      int n = Integer.parseInt(bf.readLine().trim());
      
      for(int i=1;i<=n;i++){
         for(int j=1;j<=i;j++){
            bw.write("*");
         }
         bw.write("\n");
      }
      bw.flush();
      bf.close();
      bw.close();
   }
}

몇 줄 출력할 것인지 n을 입력받고

하나의 for문은 별찍기용, 하나의 for문은 \n용으로 사용할 것이다.

일단 별을 찍고 한줄띄기를 할 것인데

\n을 출력할 for문 안에 *을 출력하는for문을 만들어줘야 그 순서가 이루어진다.

이때 *을 출력해주는 for문에는 \n을 적지않는다.

*를 출력해주는 for문은 int i(즉, \n을 수행해주는 i)의 수만큼 *을 그려줄 것이다.

for(int j =1;j<=i;j++)대로면

i=1  > *

\n

i=2  > j는 1부터 2까지 반복 > **

\n

i=3 > j는 1부터 3까지 반복 > ***

\n

이렇게 반복될 것이다.

그 다음 문제는 오른쪽 정렬로 별찍기 였고 여기서는 for문을 3개나 썼다.

출처 : https://www.acmicpc.net/problem/2439

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

public class qn2439{
   public static void main(String[] args) throws IOException{
      BufferedReader bf = new BufferedReader(new InputStreamReader(System.in)); //콘솔에서 입력받을 경우
      BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
      
      int n = Integer.parseInt(bf.readLine().trim());
      
      for(int i=1;i<=n;i++){
         for(int j=1;j<=n-i;j++){
            bw.write(" ");
         }
         for(int j=1;j<=i;j++){
            bw.write("*");
         }
         bw.write("\n");
      }
      bw.flush();
      bf.close();
      bw.close();
   }
}

*, \n, " "을 각자 찍어내는 for문을 만들어주었고

*을 찍는for문과 \n을 찍는 for문은 동일하지만

" " 즉 공백을 찍어내는 for문은 조금 다른데

오른쪽 정렬된 *을 보고싶다면 앞쪽을 공백으로 채우면 된다는 생각에

*을 찍을 공간만 빼고 모두 공백으로 채워주는 for문을 작성하였다.

n=5,i=1>     *

n=5,i=2>    **

i가 커질수록 공백이 차지하는 부분은 작아져야하기에 n-i번 반복으로 설정해두었다.

그렇게 되면

n=5,i=1>     * >>공백은 4

n=5,i=2>    ** >> 공백은 3

 

 

 

끝~!