1. 문제
◽ 주소 : https://www.acmicpc.net/problem/10172
◽ 문제 내용 :
2. 풀이
◽ 풀이 1 : System.out.print() 사용 (System 클래스 - 표준입출력) + 이스케이프 시퀀스
public class Main {
public static void main(String[] args) {
System.out.println("|\\_/|");
System.out.println("|q p| /}");
System.out.println("( 0 )\"\"\"\\");
System.out.println("|\"^\"` |");
System.out.println("||_/=\\\\__|");
}
}
- 자바 배울때 제일 먼저 배우고 가장 흔하게 사용하는 방법이다.
- 하지만 속도면에서 매우 느린편에 속한다. 왜냐하면 리소스를 많이 사용하여 성능 부하를 초래하기 때문이다.
- 입출력이 많은 코드에서는 지양하는 것이 좋다.
- 자바에서 출력할 수 없는 문자들이 있다. 이런 문자들을 출력하기 위해서 "Escape Sequance"라는 방식을 이용한다.
- Escape Sequance란 출력문에서 백슬래시가 등장하는 순간 다음 문자를 인식해 상황에 맞게 처리하는 것으로 백슬래시(\)+문자 조합이다.
- 백슬래시(\) 역시 출력할 수 없는 문자 중 하나므로 출력하기 위해선 백슬래시앞에 백슬래시를 붙여주면 된다. => \\
- 밑에 참고사항 참고(Escape Sequance 정리)
◽ 풀이 2 : BufferedWriter 사용 + 이스케이프 시퀀스
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("|q p| /}");
bw.newLine();
bw.write("( 0 )\"\"\"\\");
bw.newLine();
bw.write("|\"^\"` |");
bw.newLine();
bw.write("||_/=\\\\__|");
bw.flush();
bw.close();
}
}
- BufferedWriter은 Buffer에 있는 IO 클래스로 데이터를 버퍼에 저장해두었다가 한번에 출력하는 방식으로 동작한다.
- 데이터를 하나씩 출력하는 것이 아니라 한번에 출력하므로 속도가 빠르다.
- 입출력이 많은 코드에서 지향하는 방식이다.
- 사용이 끝났으면 무조건 스트림을 비우고( => flush()), 스트림을 종료해주어야 한다(=>close())
- 여기서도 마찬가지로 백슬래시는 출력되지 않는 문자이므로 앞에 백슬래시(\)를 붙여 출력할 수 있게 해준다.
◽ 속도 비교
- 1번 풀이 :
- 2번 풀이 :
- 출력의 양이 약간 늘어나니 BufferedWriter을 사용한 방식이 좀 더 빨라졌다.
3. 참고
<Escape Sequance: 이스케입 시컨스>
이스케이프 시퀀스란 단어 그 자체로 탈출 문자라고 보면 된다. 그럼 무엇에서 탈출하는 걸까?
바로 " " 사이에 있는 출력 구문에서 탈출하는 것이라 생각하면 이스케입 시퀀스에 대해 이해하기 쉽다.
컴파일러는 " "(' ') 안에 있는 구문을 출력문으로 여기므로 ", '을 통해 출력문의 시작과 끝을 구분한다.
만약 " "(' ') 안에서 또 "가 들어있다면 컴파일러는 두번째 만나는 "를 출력문의 끝으로 보고 남은 뒷 부분을 출력하지 않을 것이다.
이렇듯 " "(' ')안에서 문자들로 표현할 수 없는 특정 행동(줄바꿈, 탭, 백스페이스 등)과 컴파일러에 혼동을 주는 문자들(\, ', ")을 표현하기 위해서 이스케이프 시퀀스가 필요한 것이다.
이스케이프 시퀀스는 \(백슬래시) + 해당 문자 조합으로 이루어져 있다.
만약 (\, ', ")와 같은 문자를 출력하고 싶다면 해당 문자 앞에 \(백슬래시)를 덧붙여 주면 된다.
그리고 출력문 안에서 문자들로 표현할 수 없는 행동들은 정해진 해당 구문을 입력해주면 된다.
구분 | 입력 | 출력 |
∖ (백슬래시) |
∖ | Error 출력 |
∖∖ | ∖ | |
' (작은따옴표) |
∖' | ' |
print(" ' "); | ' ‥① | |
" | ∖" | " |
제어 문자 | ∖t | 탭 (기본 간격: 4) |
∖b | 한칸 앞으로(백스페이스) | |
∖n | 줄바꿈(newLine) | |
∖r | 행의 처음으로 이동(캐리지 리턴) | |
∖f | 프린트 출력시 현재 페이지 마침 | |
∖0 | Null |
+) ① : " "(큰 따옴표)안에 들어있는 '의 경우 컴파일러에 혼동을 주지 않으므로 잘 출력된다. 이 경우엔 ∖(백슬래시)를 쓰지 않아도 출력된다.