-
[Baekjoon Online Judge] 2438번: 별 찍기 - 1문제 풀이/Baekjoon Online Judge 2021. 1. 3. 17:58
[Baekjoon Online Judge] 2438번: 별 찍기 - 1
이중 루프를 사용하여 별을 찍는 아주 간단한 문제이다. 쉽게 해결할 수 있기 때문에 문제 해결에 집중하기 보단 다양한 조건을 가지고 문제를 풀었을 때 각각의 수행 시간 차이에 대해 알아보기로 했다.
총 세개의 조건을 가정하고 풀이하였다.
1. Scanner + System.out.print 조합
2. BufferedReader + BufferedWriter 조합
3. BufferedReader + StringBuilder 조합
1. Scanner + System.out.print 조합
가장 기본적으로 사용하는 Scanner + System.out.print 조합이다. Scanner 클래스는 java.util에 들어있고, JDK 1.5부터 추가되었다.
Scanner scanner = new Scanner(System.in);
사용을 위해서는 생성자에 InputStream 클래스의 인스턴스를 인자로 넘겨야 한다. 예시에서는 System.in에서 입력된 값을 바이트 단위로 읽는다.
import java.util.Scanner; // Scanner + System.out.print class Beakjoon2438 { public static void main(String[] args) throws IOException { Scanner scanner = new Scanner(System.in); int n = scanner.nextInt(); for (int i = 0; i < n; i++) { for (int j = 0; j <= i; j++) { System.out.print("*"); } System.out.println(); } } }
가장 짧고 직관적이며 간단하게 사용할 수 있다. 그 다음 소스 코드를 제출하여 수행 시간을 체크해보았다.
380ms의 시간이 걸린 것을 알 수 있다.
2. BufferedReader + BufferdWriter 조합
Reader는 입력 스트림에서 읽힌 이진 데이터를 문자열로 변환하여 반환하는 역할을 한다. Writer는 전달된 문자열을 이진 데이터로 변환하여 출력 스트림에 전달하는 역할을 한다. Reader와 Writer는 모두 추상 클래스로 이루어져 있기 때문에 사용을 위해서 추상 클래스를 구현한 클래스들을 사용해야 한다. 그 중 BufferedReader와 BufferedWriter는 버퍼를 활용한 Reader와 Writer의 구현 클래스이다.
import java.io.*; // BufferedReader + BufferedWriter public class Baekjoon2438 { public static void main(String[] args) throws IOException { BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in)); BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(System.out)); int n = Integer.parseInt(bufferedReader.readLine()); for (int i = 0; i < n; i++) { for (int j = 0; j <= i; j++) { bufferedWriter.write("*"); } bufferedWriter.write("\n"); } bufferedWriter.flush(); bufferedReader.close(); bufferedWriter.close(); } }
문제를 해결하기 위한 코드는 늘어났지만 수행시간이 줄어든 것을 알 수 있다.
3. BufferedReader + StringBuilder 조합
마지막으로 문자열을 만들어서 한번에 출력하기 위해 StringBuilder를 사용했다. String은 새로운 값을 더하거나 할당할 때 마다 새롭게 생성된다. 하지만 StringBuilder는 문자열을 추가할 때 새로운 객체를 생성하지 않고 기존에 있는 문자열을 활용한다.
import java.io.*; // BufferedReader + StringBuilder public class Baekjoon2438 { public static void main(String[] args) throws IOException { BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in)); int n = Integer.parseInt(bufferedReader.readLine()); StringBuilder stringBuilder = new StringBuilder(); for (int i = 0; i < n; i++) { for (int j = 0; j <= i; j++) { stringBuilder.append("*"); } stringBuilder.append("\n"); } System.out.println(stringBuilder.toString()); bufferedReader.close(); } }
BufferedWriter와 큰 차이는 없지만 수행 시간이 더욱 줄어든 것을 알 수 있다.
'문제 풀이 > Baekjoon Online Judge' 카테고리의 다른 글
[Baekjoon Online Judge] 2577번: 숫자의 개수 (0) 2021.01.03 [Baekjoon Online Judge] 11720번: 숫자의 합 (0) 2021.01.03 [Baekjoon Online Judge] 1744번: 수 묶기 (0) 2021.01.02 [Baekjoon Online Judge] 1138번: 한 줄로 서기 (0) 2021.01.02 [Baekjoon Online Judge] 1080번: 행렬 (0) 2021.01.01