[백준] 2557번 : Hello World - JAVA [자바]
https://www.acmicpc.net/problem/2557
-
문제
- 첫 글로 백준 알고리즘 사이트의 문제를 포스팅했다.
앞으로도 쭉 이 사이트의 단계별 문제들을 풀어보면서 풀이 방법을 같이 공유해보고자 한다.
일단.. 내가 주로 사용하는 언어가 JAVA 인 만큼 JAVA로 먼저 알고리즘을 쭉 풀어보고 단계별 문제를 다 풀게 되면 C언어나 Python 등 다른 언어로도 포스팅해보려고 한다. (뭐로 할지 고민은 나중에...)
※ 주의
나도 자바를 아직 완벽하게 못하고 계속 배우고 있는 입장이다. 내가 코딩한 알고리즘이 부족할 수 있다는 점. 만약 더 좋은 알고리즘이나 궁금한 부분은 언제든 물어보시면 아는 범위내에서 최대한 알려주려 노력할 테니 너무 뭐라 하지 말아주셨으면 한다.
아마 대부분의 언어들은 처음 접하면 해보는 것이 바로 출력이지 않을까 싶다.
그만큼 기초 중에 기초이니 자바에서도 다양한 출력방법이 있는 만큼 이번 문제에서 여러가지 출력 방법을 보여주고자 한다.
( 알고리즘 문제이니 JAVA에 대한 기본 지식은 있다는 가정하에 포스팅 할 것이다 )
-
풀이
- 방법 1 ( System 클래스 - 표준 입출력 )
public class Main {
public static void main(String[] args) {
System.out.print("Hello World!");
// System.out.println("Hello World!"); - 2번
// System.out.printf("Hello World!"); - 3번
// System.out.printf("%s","Hello World!"); - 4번
}
}
( 참고로 백준 알고리즘에서는 클래스명을 Main으로 해주어야 한다 )
아마 처음 접하는 분들이 이를 간과하고 그냥 제출하다 보니 정답률이 50%도 안되었던 듯...
가장 기초적인 방법이다. 아마 C 부터 배웠던 사람이라면 처음에는 3번과 4번이 익숙하지 않을까..
- 방법 2
import java.io.BufferedWriter;
import java.io.OutputStreamWriter;
import java.io.IOException;
public class Main {
public static void main(String[] args) throws IOException {
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
bw.write("Hello World!");
bw.flush();
bw.close();
}
}
앞으로 백준 알고리즘을 해결하는데 있어 많이 사용하게 될 방법 중 하나다.
지금 설명하기에는 글이 길어질 것 같아 나중에 따로 BufferedWriter (자매품 BufferedReader) 를 포스팅하겠다만,,,
아주아주 쉽게 비유해서 설명하면 BufferedWriter / BufferedReader는 Buffer에 있는 IO 클래스인데 이 클래스들은 데이터를 하나씩 읽어오는 것이 아니라 임시 공간(버퍼)에 저장해두었다가 한 번에 출력 또는 데이터를 보내는 방식이다.
즉, 예로들어 1000개의 데이터를 1개씩 보내는게 아니라 임시로 한 공간에 담아둔 뒤 한 번에 보내는 방법이니 당연 성능면에서 우수하다.
(속도가 빠르다고 이해하면 빠르다. 물론 빠른 이유가 이 뿐만이 아니다. )
특히 scanner 는 bufferedReader 보다 상당히 느린데, 이게 문제가 되는 것이 나중에 백준 알고리즘들을 풀다 보면 시간 초과로 통과하지 못하는 상황이 발생하니 익혀두는 것이 좋다.
이 부분은 추후 따로 자세하게 포스팅 하겠다.
- 방법 3
public class Main {
public static void main(String[] args){
StringBuilder sb = new StringBuilder();
sb.append("Hello World!");
System.out.println(sb);
}
}
StringBuilder 를 이용하는 방법이다.
이 또한 BufferedWriter 와 유사하게 데이터를 모아두었다가 한 번에 출력한다. 특히나 문자열을 조작할 때 매우 유용하다.
특징이 있다면 StringBuilder에서 문자열을 이어 붙인다는 점이다.
- 방법 4
public class Main {
public static void main(String[] args){
StringBuffer sb = new StringBuffer();
sb.append("Hello World!");
System.out.println(sb);
}
}
이 방법은 StringBuilder랑 거의 비슷하다! 다만 StringBuilder와 차이점이 있다면 StringBuffer은 동기화를 지원한다는 점.
즉, multi-thread 상황에서 문자열이 리소스로 사용된다면 StringBuffer을 사용해주어야 한다. ( StringBuilder은 동기화를 지원하지 않는다. )
아무래도 동기화를 지원하다 보니 StringBuilder 보단 느리지만 그래도 문자열 조작에 있어 String 보다 훨씬 빠르다.
대략 속도가 빠른순으로 비교해보자면
BufferedWriter >> StringBuilder > StringBuffer >>>> String
-
정리
앞으로 문제를 해결하는 데 있어 많이 사용되는 출력 방법들을 소개해보았다.
물론 이번 문제처럼 데이터양, 테스트 양이 적은 경우에는 별로 차이가 없지만 데이터양이 많아지면 많아질수록 System.out.println() 같은 표준 입출력은 하나씩 출력하기에 속도 저하 및 시간 초과로 문제를 해결 못할 수도 있다.
출력 성능과 관련하여 이 글을 참고하면 도움이 될 듯 하다.
https://www.acmicpc.net/blog/view/57
'JAVA - 백준 [BAEK JOON] > 입출력과 사칙연산' 카테고리의 다른 글
[백준] 10998번 : A×B - JAVA [자바] (0) | 2020.02.07 |
---|---|
[백준] 1001번 : A-B - JAVA [자바] (0) | 2020.02.06 |
[백준] 1000번 : A+B - JAVA [자바] (25) | 2020.02.06 |
[백준] 10172번 : 개 - JAVA [자바] (2) | 2020.02.03 |
[백준] 10171번 : 고양이 - JAVA [자바] (0) | 2020.02.02 |