<문제 제시>
<예시 입출력>
<문제 해결 과정>
이 문제는 불교 국가의 불기연도와 일반적인 서기연도 시스템을 잘 알기만하면 간단히 풀 수 있는 문제이다.
하지만 일반적으로 불교 국가의 불기연도를 잘 모르는 경우가 많은데,
불교연도는 서기연도의 +543년이다.
불교연도 = 서기연도 + 543년
이것을 이용하여 Scanner 클래스로 연도를 입력받고 간단히 풀 수 있었다.
<Scanner 클래스 이용>
import java.util.Scanner;
public class Main {
// 백준 18108번 : 불교 국가의 (불기 연도)를 (서기연도)로 변환하는 문제
public static void main(String[] args) throws IOException {
// 기본적인 Scanner 클래스 이용 방법
Scanner sc = new Scanner(System.in);
int year = sc.nextInt(); // 불기 연도 입력받기
System.out.println(year-543); // 불기연도는 서기 + 543년
}
}
하지만, 불기 연도를 구하기 위해 구글링을 해보던 중 Scanner 클래스보다 더 좋은 성능으로 푸는 방법을 알 수 있게 되었다.
BufferedReader 를 이용하는 방법이다.
<BufferedReader 이용>
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String s = br.readLine(); // BufferedReader로 받은 데이터는 br에 입력되고, br의 한 줄을 읽어 String s = 문자열로 처리
int year = Integer.parseInt(s); // 문자열 s를 Int 자료형으로 바꿔주는 메소드
System.out.println(year - 543);
}
}
BufferedReader를 이용하게 되면 버퍼 상에서 데이터를 직접적으로 가져올 수 있어 처리속도가 더 빠르다는 장점이 있다.
InputStreamReader와 IOException 또한 같이 써주어야한다.
- InputStreamReader과 관련하여 InputStream은 1byte(바이트)를 읽는 객체이다.
- InputStreamReader는 java.io 패키지의 InputStreamReader라는 클래스로, '문자로 읽을 때' 사용한다.
- BufferedReader는 InputStreamReader가 글자 그대로를 읽지만, 무한정적인 배열 크기를 가질 가능성때문에 등장한 기능이다. BufferedReader는 InputStreamReader를 입력값으로 사용하며, readLine 메소드를 통해 텍스트의 라인을 읽어낸다.
즉 한 줄을 의미하므로, Enter가 입력되기전까지는 모든 입력값이 BufferedReader에 저장되는 것이다.
복수의 값을 공백을 통해 입력할 경우 'ex) 5 4 ' .split()메소드나 토크나이저 등을 이용해 분할 후 데이터를 이용하기도 한다.
<전체코드>
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
// 백준 18108번 : 불교 국가의 (불기 연도)를 (서기연도)로 변환하는 문제
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String s = br.readLine(); // BufferedReader로 받은 데이터는 br에 입력되고, br의 한 줄을 읽어 String s = 문자열로 처리
int year = Integer.parseInt(s); // 문자열 s를 Int 자료형으로 바꿔주는 메소드
System.out.println(year - 543);
}
}
결론적으로 Scanner 클래스를 이용해 간단히 출력할 수 있는 문제였지만, 속도면에서 좋은 성능을 가진 BufferedReader를 통해 문제를 풀어볼 수 있었다. 코드를 '잘 짠다'라는 것은 코드를 써내려가는 것이 아닌 효율적이고 효과적인 코드를 짜는 것에 해당하는 것을 느낄 수 있었던 문제풀이였다.
참고)
https://makemethink.tistory.com/170
https://st-lab.tistory.com/288
문제링크)
https://www.acmicpc.net/problem/18108
'Algorithms > 백준' 카테고리의 다른 글
[백준] 2753번 '윤년' - Java (0) | 2022.09.02 |
---|---|
[백준] 10172번 '개' - Java (2) | 2022.09.01 |
[백준] 10430번 '나머지' - Java (0) | 2022.08.31 |
[백준] 1008번 'A/B' - Java (0) | 2022.08.25 |
[백준] 3003번 '킹, 퀸, 룩, 비숍, 나이트, 폰' - Java (0) | 2022.08.23 |