알고리즘/문제풀이 - 백준

[백준 2438번] 별 찍기 - 1(JAVA)

DJDU 2022. 10. 26. 11:36

문제 풀러가기✍🏻

 


서론

Scanner를 졸업하고 BufferedReader, BufferWriter를 연습하는 차원으로 문제에 접근했다.

 

시행착오(Trial&Error)

4트

50966086 - 컴파일 에러

출력예시를 참고하기 위해 코드에 복붙했는데, 지우거나 주석처리를 하지 않아서 '컴파일 에러'가 발생했다.

 

50966095 - 컴파일 에러

Main.java:12: error: unreported exception IOException; must be caught or declared to be thrown
        int num = Integer.parseInt(br.readLine());
                                              ^
1 error

IOException은 'Exception클래스와 자손들'에 속한다. 따라서, '예외처리' & 'try-catch문' 작성이 필수다. check예외이기 때문에 컴파일러가 예외처리 여부를 체크한다. try-catch문을 작성하지 않았기 때문에 '컴파일 에러'가 발생했다.

 

더보기
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

class Main {
    public static void main(String[] args) {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        
        int num = Integer.parseInt(br.readLine());  // 에러!!! error: unreported exception IOException; must be caught or declared to be thrown
        String str = "";
        for(int i = 1; i <= num; i++) {
            if(i != num) {
                str += "*";   
            }
            System.out.println(str);
        }
    }
}

 

50966164 - 틀렸습니다.

for(int i = 1; i <= num; i++) {
    if(i != num) {
        str += "*";   
    }
	System.out.println(str);
}

예제 입력에 따라 5를 입력 받은 경우, 5줄을 할애하여 첫 째줄에는 * 한 개, 마지막 줄에는 * 다섯개를 출력해야 한다. 하지만 위와 같이 조건문을 작성하면, 마지막 줄에서는 *을 추가하지 않게 되기 때문에 n번째 줄에서 n-1개의 *이 출력되고 말 것이다. 따라서 '틀렸습니다'가 떴다.

 

풀이(Solution)

java.util.Scanner를 사용할 수도 있지만, 몇 가지 장점이 더 있기 때문에 BufferedReader, BufferedWriter를 사용했다.

몇 줄을 할애할 것인지에 대한 입력 값은 br.readLine() 메서드로 받았고, 숫자이기 때문에 Integer.parseInt()로 변환했다.

반복문 중 for문을 사용했고, 초기화식에 사용된 변수 i는 0이 아닌 1을 사용했다. 1을 사용해야 첫 째줄에 * 한 개를 작성해야 한다는 뜻을 명확히 전달할 수 있기 때문이다. 따라서, 증감식도 자연스럽게 <= 를 사용했다. 

 

코드

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

class Main {
    public static void main(String[] args) {
        try {
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        
            int num = Integer.parseInt(br.readLine());
            String str = "";
            for(int i = 1; i <= num; i++) {
                str += "*";   
                System.out.println(str);
            }
            bw.close();
            br.close();
        } catch(IOException e) {}
    }
}

 


bw.close() ? br.close() ?

bw.close()와 br.close()는 참고 블로그에서 작성하길래 썼는데, 왜 쓰는지 몰라서 검색을 해봤다.

'붕어맨' 선생님 감사합니다

자바에서는 '가비지 컬렉터'가 BufferedReader의 close메서드를 명시하지 않아도 되게금 자동으로 정리를 해주지만, BufferedWriter의 close메서드는 명시해주어야 한다.

 

더보기

가비지 컬렉터 : 자신을 참조하고 있는 참조변수가 하나도 없는 인스턴스는 더 이상 사용되어질 수 없으므로 가비지 컬렉터에 의해서 자동적으로 메모리에서 삭제된다.

출처 : https://edu.goorm.io/qna/4699

 

구름EDU - 모두를 위한 맞춤형 IT교육

구름EDU는 모두를 위한 맞춤형 IT교육 플랫폼입니다. 개인/학교/기업 및 기관 별 최적화된 IT교육 솔루션을 경험해보세요. 기초부터 실무 프로그래밍 교육, 전국 초중고/대학교 온라인 강의, 기업/

edu.goorm.io