Notice
Recent Posts
Recent Comments
Link
개발자는 기록이 답이다
[백준/BOJ][Java][1152] 단어의 개수 본문
2023.08.21 - [Java] - Java, String의 constant pool과 Heap의 차이
https://www.acmicpc.net/problem/1152
내가 푼 풀이
- StringTokenizer의 countTokens()함수를 이용해서 매우 쉽게 풀었다.
- 다른 사람들도 이렇게 풀었을 줄 알았는데, 이걸 사용안하고 분기처리를 해서 풀었더라..
- 근데 다른 사람 풀이가 이렇게 간단한 내 풀이보다 코드길이는 쪼~금 길지만, 메모리랑 시간이 거의 1/2배였다. 왜일까?
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));
StringTokenizer st = new StringTokenizer(br.readLine());
System.out.println(st.countTokens());
}
}
메모리 | 시간 | 언어 | 코드 길이 |
20548KB | 180ms | Java8 | 420B |
다른 사람 풀이
- System.in.read()는 각 입력값에 대해 아스키 코드로 반환한다
int ch = System.in.read();
System.out.println("ch = " + ch); // -> 84 (int)
- 공백을 기준으로 ' '일때 cnt++하고, 마지막 '\n'일때 cnt ++해줘서 break일때 while문을 종료한다.
- pre를 word로 보면 되고, 공백이 아닐때 마다 word에 각 단어를 대입하고 공백이 아닌 경우에 카운트를 더한다.
import java.io.IOException;
public class Main {
public static void main(String[] args) throws IOException {
int cnt = 0;
int pre = ' ';
while (true) {
int ch = System.in.read();
if(ch == '\n') {
if(pre != ' ') cnt++;
break;
}
if(ch == ' ') {
if(pre != ' ') cnt++;
}
pre = ch;
}
System.out.println(cnt);
}
}
메모리 | 시간 | 언어 | 코드 길이 |
11508KB | 104ms | Java8 | 475B |
다른 사람 풀이랑 비교
- StringTokenizer vs 문자 단위 읽기:
- 첫 번째 코드에서는 StringTokenizer를 사용하여 입력 문자열을 공백을 기준으로 토큰으로 나누었습니다. StringTokenizer는 문자열을 토큰으로 나누는 작업에 매우 편리하지만, 내부적으로 문자열을 파싱하면서 문자열 객체와 관련된 작업이 수행되기 때문에 메모리 사용량이 더 커질 수 있습니다.
- 두 번째 코드에서는 문자를 바이트 단위로 읽으면서 공백을 기준으로 토큰을 나누는 작업을 수행했습니다. 이는 문자열 파싱 없이 문자를 직접 처리하는 것으로 메모리 사용량이 더 작을 수 있습니다.
- System.in.read() 호출 횟수:
- 첫 번째 코드에서는 한 줄을 통째로 읽은 뒤 StringTokenizer로 나누어 토큰 개수를 세기 때문에 입력을 모두 받은 뒤에야 토큰 개수를 확인할 수 있습니다.
- 두 번째 코드에서는 문자를 읽으면서 토큰의 개수를 바로 세기 때문에 입력을 받으면서 동시에 토큰 개수를 확인할 수 있습니다.
따라서 두 번째 코드가 더 메모리 효율적이고, 문자 단위 읽기로 인해 입력을 받으면서 처리하는 방식으로 속도가 더 빠를 수 있습니다. 알고리즘적으로는 입력을 받으면서 토큰의 개수를 세는 두 번째 코드가 더 효율적인 접근 방식이라고 볼 수 있습니다.
참고 링크 :
https://devyoseph.tistory.com/141
https://kobalja2020.tistory.com/entry/Java-자바-기본-입-출력-Systeminread-에-대하여
'알고리즘 > 백준' 카테고리의 다른 글
[백준/BOJ][Java][5622] 다이얼 (0) | 2023.08.25 |
---|---|
[백준/BOJ][Java][11718] 그대로 출력하기 (0) | 2023.08.25 |
[백준/BOJ][Java][2675] 문자열 반복 (0) | 2023.08.24 |
[백준/BOJ][Java][2908] 상수 (0) | 2023.08.24 |
[백준/BOJ][Java][10809] 알파벳 찾기 (1) | 2023.08.24 |