[백준] 10820 - 문자열 분석



문제 풀이 정보




문제

문자열 N개가 주어진다. 이 때, 문자열에 포함되어 있는 소문자, 대문자, 숫자, 공백의 개수를 구하는 프로그램을 작성하시오. 각 문자열은 알파벳 소문자, 대문자, 숫자, 공백으로만 이루어져 있다.

첫째 줄부터 N번째 줄까지 문자열이 주어진다. (1 ≤ N ≤ 100) 문자열의 길이는 100을 넘지 않는다.

첫째 줄부터 N번째 줄까지 각각의 문자열에 대해서 소문자, 대문자, 숫자, 공백의 개수를 공백으로 구분해 출력한다.



작성한 소스코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
public static void main(String[] args) throws IOException {
int count, i, lower, upper, num, space;
String words = "";

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

while ((words = br.readLine()) != null) {
lower=0; upper=0; num=0; space=0;
count = words.length();

for (i=0; i<count; i++) {
if (words.toCharArray()[i] == ' ')
space++;
else if (words.toCharArray()[i] >= 48 && words.toCharArray()[i] <= 57)
num++;
else if (words.toCharArray()[i] >= 65 && words.toCharArray()[i] <= 90)
upper++;
else if (words.toCharArray()[i] >= 97 && words.toCharArray()[i] <= 122)
lower++;
}

System.out.println(lower + " " + upper + " " + num + " " + space + " ");
}
}
}



출력 결과




메모

Java에서의 입력은 보통 Scanner를 이용하여 받아왔는데 이번 문제를 풀면서 입력을 위해 사용되는 또 다른 방법인 BufferedReader, InputStreamReader에 대해 추가적으로 공부하게 되었다. 가장 먼저, 문자열의 길이를 판단하기 위해 사용할 정수형 변수 count, 문자열에 들어가는 글자 하나하나를 확인하는 경우 for문을 돌아야 하는데, 그에 사용할 임시 정수형 변수 i, 그리고 소문자, 대문자, 숫자, 공백을 나타내는 각각의 정수형 변수 lower, upper, num, space를 선언하였다.

이 문제에서는 입력을 받는 횟수가 정해져 있지 않기 때문에 파일의 끝에 도달한 경우 즉, EOF의 경우에는 프로그램이 종료되도록 설정해야 했다. C로 코딩했을 때는 단순히 while(scanf("%d", &temp) != EOF)와 같은 방식으로 작성하면 동작했었는데 Java에서는 그 방법을 몰라 인터넷에서 그 내용을 검색해보았다. Scanner를 이용하여 EOF에 도달한 경우에 while문을 탈출할 수 있는 방법도 존재했지만 BufferedReader를 이용하면 Scanner보다 더 빠른 속도로 입력 받을 수 있다는 점과 while((words = br.readLine()) != null)과 같이 간단히 표현할 수 있다는 점을 깨닫고 BufferedReader를 사용하여 코드를 작성해보았다.

이 BufferedReader는 한 줄을 통째로 입력받는 방법이어서 초반에 선언해야 할 것은 많지만 Scanner보다는 비교적 빠를 수 있다는 장점이 있다고 한다. 사실 학교에서 Java를 수강했을 때 이 내용을 공부하긴 했었지만 뭔가 복잡하기도 하고 어려운 것 같아 피하기만 했었는데 더 유용하고 빠르게 쓰일 수 있다고 하니 앞으로 잘 알아두어야 할 것 같다. 다만 BufferedReader를 쓸 때 예외사항이 생기기도 했는데 그 부분은 throws IOException으로 예외처리 해줌으로써 해결하였다.

입력의 끝이 나올 때까지 while문을 돌려 문자열을 입력받도록 하였고, 입력받은 문자열 words를 한 글자씩 확인해보기 위하여 toCharArray() 함수를 이용하여 배열처럼 취급하고 들어가는 값들을 아스키코드 혹은 공백 기호를 이용하여 각각 비교하였다. 숫자 구간에 해당하는 아스키코드 48-57, 대문자 구간에 해당하는 아스키코드 65-90, 소문자 구간에 해당하는 아스키코드 97-122와 공백 기호 ‘ ‘ 를 이용하여 들어가는 값들을 하나하나 비교하고 해당 값에 맞게 그 변수의 값을 하나씩 증가시켜 주었다. 마지막으로 문자열에 들어가는 하나하나의 문자들을 비교한 후에 변수에 값들이 알맞게 들어가면 그 값들을 열거하여 출력해주도록 하였다.

평소에 Java 관련 문제를 풀 때 많은 사람들이 BufferedReader를 이용하여 입력을 받는 것을 보고 왜 그렇게 쓰는지 이해를 못 했었는데 Scanner를 사용한 사람들과 BufferedReader를 사용한 사람들의 코드를 비교해 본 결과 확실히 시간 단축면에서 유용하다는 점을 알게 되었고 혹시 다른 부분에서도 더 큰 이점이 있는지 앞으로 쓰면서 더 알아봐야 할 것 같다.

Author

Alec J

Posted on

2018-04-09

Updated on

2021-02-09

Licensed under