안녕하세요
백준 알고리즘 단계별로 풀어보기 7단계 단어의 개수를 풀어봤습니다
이번 문제도 어렵지 않게 풀 수 있는 문제였습니다
제가 푼 방식에 대해서 설명하겠습니다!
문제 링크입니다
https://www.acmicpc.net/problem/1152
문제
영어 대소문자와 띄어쓰기만으로 이루어진 문자열이 주어진다. 이 문자열에는 몇 개의 단어가 있을까? 이를 구하는 프로그램을 작성하시오. 단, 한 단어가 여러 번 등장하면 등장한 횟수만큼 모두 세어야 한다.
입력
첫 줄에 영어 대소문자와 띄어쓰기로 이루어진 문자열이 주어진다. 이 문자열의 길이는 1,000,000을 넘지 않는다. 단어는 띄어쓰기 한 개로 구분되며, 공백이 연속해서 나오는 경우는 없다. 또한 문자열의 앞과 뒤에는 공백이 있을 수도 있다.
출력
첫째 줄에 단어의 개수를 출력한다.
문제 풀이
첫 번째 방법은 Split을 사용하여 문자열을 배열로 나눠 배열의 갯수를 세는 방식입니다
처음 문제를 봤을 때 Split을 사용하면 되겠다!
생각나서 풀었지만 속도가 처참... ㅠ
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) throws IOException {
// BufferedReader 변수 선언
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// split을 사용 배열로 입력
String[] sb = br.readLine().split(" ");
// 갯수만큼 Count
int count = sb.length;
// 단어가 없으면 갯수 마이너스
for(int i = 0; i < sb.length; i++) {
if(sb[i].equals(""))
count--;
}
//결과 출력
System.out.print(count);
}
}
두 번째 방법은 charAt을 사용해서 공백인 경우 갯수를 Count합니다
첫 번째 글자가 공백인 경우는 마이너스, 마지막 글자가 공백이 아니라면 플러스합니다
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) throws IOException {
// BufferedReader 변수 선언
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// 문자 입력
String str = br.readLine();
// Count 변수 선언
int count = 0;
// 공백이 있으면 Count++
for(int i = 0; i < str.length(); i++)
{
if(str.charAt(i) == ' ')
count++;
}
// 첫 글자가 공백이면 마이너스
if(str.charAt(0) == ' ')
count--;
// 마지막 글자가 공백이 아니라면 플러스
if(str.charAt(str.length() - 1) != ' ')
count++;
// 결과 출력
System.out.print(count);
}
}
세 번째 방법은 StringTokenizer의 메서드 중 하나인 countTokens()를 사용한 방법입니다
제일 짧고 간단한 방법입니다
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main3 {
public static void main(String[] args) throws Exception {
// BufferedReader 변수 선언
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
// 구분자의 갯수를 계산
System.out.println(st.countTokens());
}
}
네 번째 방법입니다
제일 최적화가 잘 된 코드입니다
System.in.read()를 통하여 입력하는 바로바로 문자열을 체크해서 갯수를 카운트합니다
public class Main {
public static void main(String[] args) throws Exception {
// Count, 이전String, 현재String 변수 선언
int count = 0;
int pre_str = 32; // Ascii코드에서는 32가 공백
int str;
// 반복문 시작
while(true) {
// 입력
str = System.in.read();
// 첫 번째 글자가 공백인 경우를 제외하고 글자에 공백이 나온 경우 플러스
if(str == 32) {
if(pre_str != 32)
count++;
}
// Ascii코드에서는 10이 Enter
// 마지막 글자가 공백이 아니라면 플러스
else if(str == 10) {
if(pre_str != 32)
count++;
break;
}
pre_str = str;
}
// 결과 출력
System.out.print(count);
}
}
속도 비교
1. Split()
2. charAt()
3. StringTokenizer()
4. System.in.read()
방식으로 풀었을 때 메모리아 시간 비교입니다
4번 방식이 제일 빠른 것을 볼 수 있습니다
이상 백준 알고리즘 1152번 단어의 개수를 풀은 내용이었습니다
다음 문제 : 2021.05.17 - [알고리즘/알고리즘JAVA] - [백준알고리즘/문자열] 2908번 문제 : 상수(자바/JAVA)
이전 문제 : 2021.05.16 - [알고리즘/알고리즘JAVA] - [백준알고리즘/문자열] 1157번 문제 : 단어 공부(자바/JAVA)
'프로그래밍 > JAVA' 카테고리의 다른 글
[JAVA] 문자열 공백제거 Trim()에 대해서 알아보자! (0) | 2021.05.17 |
---|---|
[JAVA] 문자열을 배열로 자르는 메서드 split에 대해서 알아봅시다 (0) | 2021.05.17 |
[JAVA] 문자열 반복 메서드 repeat 대해서 알아봅시다 (0) | 2021.05.16 |
[JAVA] Arrays.fill() 사용 방법(배열의 값 일괄초기화) (0) | 2021.05.16 |
[JAVA] indexOf, lastIndexOf 사용 방법 (0) | 2021.05.16 |