일단 java를 학사과정에서 1차적으로 배웠고, 패스트캠퍼스 챌린지를 진행하면서 java에 대한 지식이 많이 깊어졌다고 생각했습니다.
하지만 회사를 들어가기 위한 코딩테스트를 모두 python으로 공부했기 때문에, 문제를 풀기 위한 지식에 대한 부분에서 얻어갈 수 있는 것이 많을 것이라고 생각하여 매일 코딩테스트 문제를 java로 풀어볼 예정입니다.
puilic class Main{
public static void main(String[] args){
}
}
백준에서는 작성한 소스코드를 실행하기 위해 반드시 Main클래스를 필요로 합니다.
아래 글에서 확인했습니다.
https://korean-otter.tistory.com/entry/%EB%B0%B1%EC%A4%80%EC%97%90-%EC%9E%90%EB%B0%94-%EC%A0%9C%EC%B6%9C%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95
import java.util.Scanner;
Scanner scanner = new Scanner(System.in);
일반적으로 자바를 사용하게 되면 입출력으로 System.out.println과 Scanner를 사용하게 되는데, 아래 문제에서는 위의 방식으로는 풀 수 없다고 나와있습니다.
https://www.acmicpc.net/problem/15552
문제에서는 BufferedReader, BufferedWriter를 사용하라고 권장하고 있는데, 이 입출력 방식에 대해서 꼭 정리할 필요성을 느끼게 되었습니다.
import java.io.BufferedReader
import java.io.BufferedWriter
...
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
BufferedReader와 BufferedWriter는 생성자의 인자로 각각 InputStreamReader와 OutputStreamWriter를 가진다. 이 형태는 백준 문제에서는 크게 달라질 일이 없겠으나, 파일스트림이나 다른 형태의 스트림도 받을 수 있다.
Stream 객체의 Reader,Writer 그리고 Stream 간의 차이는 문자를 읽느냐 바이트 단위를 읽느냐의 차이.(자세한 것은 나중에,,)
String s = br.readLine(); //한줄을 읽어들이기
int a = Integer.parseInt(s.split(" ")[0])
int b = Integer.parseInt(s.split(" ")[1])
만약 한 줄에 두 개의 정수형태의 값을 입력받았다면, 읽어온 String을 공백을 기준으로 분리하여 읽어온 값들을 하나씩 사용하면 된다. split은 String[] 형태를 리턴한다.
import java.util.StringTokenizer;
StringTokenizer st = new StringTokenizer(br.readLine());
while(st.hasMoreTokens()){
bw.write(Integer.parseInt(st.nextToken()));
bw.flush();
}
다른 방식으로는 StringTokenizer를 사용하는 것인데, StringTokenizer에 br.readLine으로 읽어 온 값을 넣어주게 되면 Token 형태로 나눠준다.
그러면 hasMoreTokens()로 모든 토큰을 순회할 수 있다.
bw는 단순히 Stream에 문자열 단위로 쓸 뿐이므로, buffer에 가지고 있는 값을 쓰기 위해서는 반드시 flush해야 한다.
while(st.hasMoreTokens()){
bw.write(Integer.parseInt(st.nextToken()));
bw.flush();
}
이 형태에서 만약 bw.flush()하지 않으면 아무값도 write 되지 않는다.
입출력과 사칙연산, if문, for문 완료
29문제 해결