
StringTokenizer ipt = new StringTokenizer(input);

뭔가 갑자기 문제난이도가 확 뛰는 느낌이었다.
이유는 Scanner를 통해 단순한 입력값만 받다가, 꽤 많은 입력값을 받고, 출력값도 그만큼 많아졌기 때문.
여기서 새로운 문법을 많이 배웠다.
1. BufferedReader
보통 버퍼링으로 많이 알고들 있을 buffer는, 데이터가 이동시 임시저장공간이라고 생각하면 편하다.
Scanner의 경우 줄바꿈이나 공백을 기준으로 끊어서 입력받지만, BufferedReader는 줄바꿈으로 입력을 받는다.
또한, Scanner보다 입력받는 시간이 훨씬 절약된다.
다른 이론적 공부를 하지 않았다면, BufferedReader를 쓰는 구문을 이해하기는 쉽지 않다. 그냥 외우고 쓰다보면, 나중에 공부하다 자연스럽게 알게되니 그냥 외워서 사용하자. 나같은 경우, 이때까지만 해도 이론을 공부하지 않고 썼기에, 그냥 Scanner로 입력받던 모든 코딩을 BufferedReade로 바꾸어서 금방 외웠다. 단, 수업시간은 강사님이 진행하는대로 Scanner를 사용하였다.
BufferReader br = new BufferedReader(new InputStreamReader(System.in));
주의할점은, BufferedReader 뿐 아니라, InputStreamReader 또한 라이브러리에 추가해서 사용해야한다.
단축키 컨트롤+쉬프트+O를 통해 쉽게 로드할 수 있다.
2. IOException
buffer로 입력을 받는 BufferedReader를 사용시, 잘못된 입력에 대한 예외처리를 해주어야 하는데 가장 간편하면서도 (무책임한) 방법이 throws 다. try-catch 구문으로 예외발생이 예상되는 구간을 하나씩 잡아주어 예외 발생시 처리법을 코딩해주는것이 제일 좋지만, 백준 문제에서는 예상 입력값이 정해져 있기에 그렇게까지 할 필요는 없다.
다음과 같이 매소드 옆에 선언해주면 된다. 마찬가지로, 라이브러리에서 불러와야 한다.
public static void main(String[] args) throws IOException
3. StringTokenizer
String Tokenizer는, String(문자열)을 토큰화한다고 생각하면 편하다. 토큰은 일종의 조각정도로 이해하면 쉽다. 문자열에 공백 등이 존재하면, 그걸 경계로 각각의 문자열을 조각내어 토큰화한다.
마찬가지로 라이브러리에서 불러와야한다.
사용법 예)
StringTokenizer 변수명 = new StringTokenizer(문자열);
변수명.nextToken(); // 다음 토큰으로 넘어감
4. StringBuilder
StringBuilder 는 문자열의 합이 빈번한 경우, 새로운 문자열의 생성이 남용되지 않기 위해 사용됩니다.
이부분도 자세히 설명하면, 현재 진도(?)에 비해 너무 복잡하고 길어지니 생략합니다.
여하튼간에, 입력값과 온전한 체스수의 값을 비교하여 그 차이만큼 출력해주면 되겠습니다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String input = br.readLine();
String output = "1 1 2 2 2 8";
StringTokenizer ipt = new StringTokenizer(input);
StringTokenizer opt = new StringTokenizer(output);
StringBuilder sb = new StringBuilder();
for (int i=0; i<6; i++) {
sb.append(Integer.parseInt(opt.nextToken()) - Integer.parseInt(ipt.nextToken()) + " ");
}
System.out.println(sb);
}
}
'백준 문제풀이 > 입출력과 사칙연산' 카테고리의 다른 글
| 2588. 곱셈 (0) | 2022.09.11 |
|---|---|
| 10430 : 나머지 (0) | 2022.08.28 |
| 18108 : 1998년생인 내가 태국에서는 2541년생?! (0) | 2022.08.28 |
| 10926 : ??! (0) | 2022.08.28 |
| 10869. 사칙연산 (0) | 2022.08.28 |