오랜만에 알고리즘을 풀어볼까 하여 백준 문제를 단계별로 풀어봤다.
이전에도 했었는데 무시하고 처음부터 풀어볼련다. 1년을 하면 얼마나 풀 수 있을지... 일과 병행 하면서 얼마나 풀 수 있을지 궁금하다.
오늘은 간단하게 입출력 문제를 풀어봤고 거기서 배운 내용을 끄적끄적 써내려 가본다잉.
이전에는 항상 Scanner
만 사용했었는데 이번에 자바의 정석
을 공부하면서 다양한 입출력방식에 대해 배웠고 이전에도 문제를 풀때 봐왔던 BufferedReader
와 BufferedWriter
를 간단하게 정리 해보자!
//BufferedWriter 를 사용해보자!
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
bw.write("Hello World");
bw.close();
BufferedWriter
를 사용할 때 보면 OutputStreamWriter
도 사용하고 있는데 이는 BufferedWriter
은 보조 스트림이라 단독으로는 사용할 수 없기 때문이다.
입출력에 관한 자바의 정석 챕터를 공부했으나 벨로그에 정리하지 않았다... 나중에 꼭 해야겠다.
입력도 크게 다르지 않다! 여기에 추가로 StringTokenizer
도 정리해보겠다.
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(bf.readLine(), " ");
int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
System.out.println(a + b);
단순히 숫자 2개를 입력받아서 더하기 출력하는 것이다. 이전에는 간단하게
Scanner sc = new Scanner(System.in);
int a = sc.nextInt();
int b = sc.nextInt();
System.out.println(a + b);
를 사용했었다.
달라진 점은 좀 더 효율적인 버퍼를 사용하고 있다는 것이다.
그리고 버퍼를 사용하면 2번째 줄에 있는 것 처럼bf.readLine()
을 사용해야 하는데
이렇게 되면 한줄을 통째로 읽기 때문에 공백을 사용할 경우 에러가 발생한다!
(여기서는 숫자를 사용하기 때문)
그래서 StringTokenizer
를 사용해서 한줄에 입력받는 경우 공백으로 분리 해주는 것이다.
StringTokenizer("문자열",구분자);
를 사용하면 된다고 한다. 특히 구분자 자리에 " "
여기 스페이스를 쳐서 공백을 만들어줬다는 것에 주의하자.
사실 StringTokenizer
를 사용하지 않고
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
int a = Integer.parseInt(bf.readLine());
int b = Integer.parseInt(bf.readLine());
System.out.println(a + b);
이렇게 하면 입력을 두 줄 하면 되긴 함...ㅎㅎ
이렇게!! 근데 한 줄로 처리해야하는 문제가 있어서 StringTokenizer
를 자주 애용하도록 하겠다.
(만약 입력을 두 줄로 받는다면 사용할 필요가 없겠죠?)
아!! 그리고 StringTokenizer
를 사용하게 되면 입력 내용을 불러올때 .nextToken()
을 사용해야 한다!
이 녀석은 String
형태로 반환하기 때문에 Integer.parseInt()
를 사용했음에 주의.
.nextToken()
을 사용해서 반환하면 반환과 동시에 해당 객체는 소모되어 사라진다고 한다.
왜 틀렸지??? 하고 찾아보니 아주 기본적인 능지이슈였다.....ㅎㅎㅎ.....
백준 11382번 꼬마 정민 문제.
첫번째 줄에 A,B,C(1 <=A,B,C <= 10(12)) (어라....제곱 어떻게 쓰지..?) 크흠.... 어.. 어쨋든 간에..
이런 조건이 있는데 그냥 냅다 int로 갈겨버려서 틀렸던 거란다...
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(bf.readLine(), " ");
int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
int c = Integer.parseInt(st.nextToken());
System.out.println(a + b + c);
int형으로 해버리면 숫자 크기를 넘기 때문에 long으로 해줘야 성공한다고 한다..!
두근두근 (틀린 건 무시해주세요.. 앞에 능지이슈를 말했기 때문에...ㅎㅎ)
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(bf.readLine(), " ");
long a = Long.parseLong(st.nextToken());
long b = Long.parseLong(st.nextToken());
long c = Long.parseLong(st.nextToken());
System.out.println(a + b + c);
히히...!! 마..맞았다!!
아!! 그러면 여기는 한줄로 입력받는 예제니까 앞에서 말했던 것처럼 StringTokenizer
를 안쓰면 어떻게 될까?
일단 인텔리제이에서는 한 줄씩 입력을 해서 작동을 한다. 과연 백준에서는???
가장 위에 런타임에러
를 봐주세용. 바로 에러가 나뿐다.... 한 줄에 입력받아야 되는 모양!!!
여기까지 int의 범위를 생각안한 초짜 코더의 한탄의 벨로그 였다.
누군가 봤다면 부끄러우니 모른척 지나가주라..... 히히! (이런 실수 하지마세요)
버퍼, 인풋,아웃풋 스트림에 대해서 알고 사용할 수 있어서 좋았다. 일단 문제를 풀면서 시간이 되면 I/O에 대해서 정리도 해야겠다.
그리고 좀 기본형 범위도 알아라 제발....... 조건도 좀 잘 보고.....
그럼 이만! 안녕~!~!~!