[20220131] 백준 1일차

시작하기 전..

일단 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 간의 차이는 문자를 읽느냐 바이트 단위를 읽느냐의 차이.(자세한 것은 나중에,,)

  • br 과 bw를 사용하게 되면 IOException을 처리해야 함..

BufferedReader 사용 형태

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()로 모든 토큰을 순회할 수 있다.

BufferedWriter

bw는 단순히 Stream에 문자열 단위로 쓸 뿐이므로, buffer에 가지고 있는 값을 쓰기 위해서는 반드시 flush해야 한다.

while(st.hasMoreTokens()){
	bw.write(Integer.parseInt(st.nextToken()));
bw.flush();
}

이 형태에서 만약 bw.flush()하지 않으면 아무값도 write 되지 않는다.

금일 수행한 부분

입출력과 사칙연산, if문, for문 완료
29문제 해결

좋은 웹페이지 즐겨찾기