[백준] 10718번 : We love kriii - JAVA [자바]
https://www.acmicpc.net/problem/10718
- 문제
- 4가지 풀이 방법을 이용한다.
크게 System 클래스, BufferedReader, StringBuilder, StringBuffer 를 이용하여 풀이 할 것이다.
기본 사용 방법은 전 포스트에서도 잠깐 언급했으니 참고해보아도 좋을 듯 하다.
2020/01/29 - [JAVA/백준[BEAKJOON]] - [백준] 2557번 : Hello World
- 풀이
- 방법 1 ( System 클래스 - 표준 입출력 )
public class Main {
public static void main(String[] args) {
System.out.println("강한친구 대한육군");
System.out.println("강한친구 대한육군");
// 그 외의 방법들
// System.out.printf("%s","강한친구 대한육군\n강한친구 대한육군");
// System.out.printf("%s\n%s","강한친구 대한육군","강한친구 대한육군");
// System.out.printf("강한친구 대한육군\n강한친구 대한육군");
}
}
나 또한 단순 출력으로 할 때는 println(); 을 쓴다.
그 외에는 특정 순서에 따라 개행( '\n') 하거나 문자열과 숫자 등 서로 다른 타입을 다룰 때는 printf(); 또는 print(); 를 쓴다.
- 방법 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("강한친구 대한육군");
bw.newLine(); // 줄 구분자
bw.write("강한친구 대한육군");
bw.flush();
bw.close();
}
}
BufferedWriter 을 쓰는 방식이다.
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); 을 간략하게 뜯어보려면 아래를 클릭하길..
먼저 Buffer 는 데이터를 다른 곳으로 이동시키기 전에 일시적으로 데이터를 보관하는 임시 메모리 영역이라고 생각하면 된다.
우리가 이사할 때 이삿짐센터 차에 물건들을 임시로 모아서 보관하는 거로 생각하면 이해가 편할 것 같다.
즉, BufferedWriter 는 시스템의 버퍼를 이용하여 출력하는 문자 스트림 (캐릭터 단위 스트림) 이라는 것.
그럼 OutputStreamWriter() 은 무엇이냐..
일단 Stream 의 의미를 알아야 하는데, 간략하게 말하자면 한 지점에서 데이터를 단일 방향으로 목표지점에 도착하는 중간매개체 또는 흐름(통로)이라고 보면 된다.
이때 운영체제에 따라 기본 인코딩 방식이 다른데 이를 알아서 변경해준다.
나는 MACbook을 쓰고있는지라 유닉스 기반이다. 기본이 UTF-8 형식으로 인코딩하게 되는데 Windows는 따로 설정하지 않는 한 MS949 라는 형식으로 인코딩 하기 때문에 윈도우에서 한글로 작성한 메모장 파일을 맥에서는 깨져서 보이게 된다. 뭐.. 이러한 이유들로 stream을 사용한다.
(윈도우더라도 따로 설정해서 UTF-8을 쓰는걸 되도록 추천한다.)
이 말도 어렵다면 위에 자동으로 OS에 맞게 인코딩 방식을 변경해준다는 점은 나중으로 미루고
가장 기본 기능만 말하자면 우리가 음료수에 빨대를 꼽고 음료수를 마실 때, 이 음료수가 빨대라는 중간 매개체를 통해 음료가 쌓이고 목적지로 보내는 역할을 하는 스트림이라고 이해하면 쉽다.
위에 BufferedWriter 은 문자 스트림이라고 했는데 OutputStreamWriter() 은 문자 스트림을 바이트 스트림으로 변환해주는 스트림이다.
bw.newLine(); 이 추가되었는데 이 메소드는 개행을 해주는 메소드다.
참고로 newLine(); 은 '\n' 과 같은 '역할'은 하지만 '\n' 과 같은 것은 아니다.
자바 API 를 보면 이렇게 설명되어있다.
( 추가로 println(); 메소드도 마찬가지로 '\n' 과 엄연하게 말하면 같은 것은 아니다. )
이후 bw.flush() 로 스트림에 들어있는 데이터를 비운다.
그리고 꼭 bw.close() 로 스트림을 종료해준다.
이 부분은 추후 따로 자세하게 포스팅 하겠다.
- 방법 3
public class Main {
public static void main(String[] args){
StringBuilder sb = new StringBuilder();
sb.append("강한친구 대한육군\n");
sb.append("강한친구 대한육군");
System.out.println(sb);
}
}
StringBuilder 를 이용하는 방법이다.
바로 이전 포스팅에서도 설명했지만 문자열을 이어 붙이는 것이기 때문에 사실상 저 sb에 연결되어 있는 문자열은
"강한친구 대한육군\n강한친구 대한육군" 이다.
- 방법 4
public class Main {
public static void main(String[] args){
StringBuffer sb = new StringBuffer();
sb.append("강한친구 대한육군\n");
sb.append("강한친구 대한육군");
System.out.println(sb);
}
}
이것도 StringBuilder랑 똑같다.
- 정리
오늘 어쩌다보니 Buffer 입출력에 대해 글이 길어졌다. 일단 백준에서 가장 일반적으로 쓰이는 것은 StringBuilder 하고 BufferedReader/BufferedWriter 이기 때문에 꼭 알아두면 좋겠다는 의미에서 계속 쓰고 있다.
시간이 되는대로 빨리 저 걸 정리해서 글을 올려야 할 것 같다.
'JAVA - 백준 [BAEK JOON] > 기타 문제' 카테고리의 다른 글
[백준] 5543번 : 상근날드 - JAVA [자바] (0) | 2020.03.04 |
---|---|
[백준] 2577번 : 숫자의 개수 - JAVA [자바] (36) | 2020.02.28 |
[백준] 2742번 : 기찍 N - JAVA [자바] (6) | 2020.02.18 |
[백준] 2741번 : N 찍기 - JAVA [자바] (11) | 2020.02.18 |
[백준] 10817번 : 세 수 - JAVA [자바] (2) | 2020.02.14 |