알고리즘 공부

Drumj·2023년 3월 6일
0
post-thumbnail

오늘의 학습

오랜만에 알고리즘을 풀어볼까 하여 백준 문제를 단계별로 풀어봤다.

이전에도 했었는데 무시하고 처음부터 풀어볼련다. 1년을 하면 얼마나 풀 수 있을지... 일과 병행 하면서 얼마나 풀 수 있을지 궁금하다.

오늘은 간단하게 입출력 문제를 풀어봤고 거기서 배운 내용을 끄적끄적 써내려 가본다잉.


입출력 방식에 대한 공부

이전에는 항상 Scanner만 사용했었는데 이번에 자바의 정석을 공부하면서 다양한 입출력방식에 대해 배웠고 이전에도 문제를 풀때 봐왔던 BufferedReaderBufferedWriter를 간단하게 정리 해보자!

//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에 대해서 정리도 해야겠다.

그리고 좀 기본형 범위도 알아라 제발....... 조건도 좀 잘 보고.....

그럼 이만! 안녕~!~!~!

0개의 댓글