바로 이전 게시글에 이어 2번째 포스팅
사실 이문제는 어렵다보기 보다는 문자열 입력을 받는 방법에 대해 얼마나 다양하게 아느냐에 따라 갈릴듯하다
https://www.acmicpc.net/problem/10820
10820번: 문자열 분석
문자열 N개가 주어진다. 이때, 문자열에 포함되어 있는 소문자, 대문자, 숫자, 공백의 개수를 구하는 프로그램을 작성하시오. 각 문자열은 알파벳 소문자, 대문자, 숫자, 공백으로만 이루어져 있
www.acmicpc.net
문제
문자열 N개가 주어진다. 이때, 문자열에 포함되어 있는 소문자, 대문자, 숫자, 공백의 개수를 구하는 프로그램을 작성하시오.
각 문자열은 알파벳 소문자, 대문자, 숫자, 공백으로만 이루어져 있다.
입력
첫째 줄부터 N번째 줄까지 문자열이 주어진다. (1 ≤ N ≤ 100) 문자열의 길이는 100을 넘지 않는다.
출력
첫째 줄부터 N번째 줄까지 각각의 문자열에 대해서 소문자, 대문자, 숫자, 공백의 개수를 공백으로 구분해 출력한다.
예제 입력 1
This is String
SPACE 1 SPACE
S a M p L e I n P u T
0L1A2S3T4L5I6N7E8
예제 출력 1
10 2 0 2
0 10 1 8
5 6 0 16
0 8 9 0
문제의 내용은 이렇다.
여기서 개행을 어떻게 판단하여 반복문을 돌릴까가 요점이었다.
어떤 방법이 있는지 찾아보았는데
대략
1. BufferedReader를 사용하여 readLine()을 사용하여 한줄씩 읽고, 다음 행의 문자열이 Null일때 반복문 탈출
2. hasNextLine()을 쓴다. Scanner를 사용해야할때 다음 행에 문자열의 유무 확인을 해당 메소드를 쓰면 된다.
이 두 가지를 찾았다.
bufferedReader를 사용하냐 스캐너를 사용하냐 차이인데.
처리 속도면에서는 bufferedReader가 좀 더 빠르다는 장점이 있어서 해당 문제 풀이시 BufferedReader를 사용했다.
사실 자바를 공부할때 책을 정독 1회 이상 or 코딩테스트 준비간 Buffered 관련 문제는 마주칠 수 밖에 없어서 알 사람들은 다 알듯 ㅎㅎ ㅋㅋㅋ
(분명 맞게 풀었는데 시간 초과가 뜨는 경우가 있는데 이 때 스캐너 대신 BufferedReader를 사용해야하는 문제가 있음!)
어쨌든 내가 풀이한 코드다.
import java.io.*;
public class test_algo {
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String line = "";
while((line=br.readLine())!=null) { //다음 읽어들일 내용이 없을때까지
int countArray[] = new int[4]; //반복할때마다 초기화
//소문자,대문자,숫자,공백 순으로 저장한다
for(int i=0;i<line.length();i++) {
char in = line.charAt(i); //문자 하나씩 순서대로 대조
if((int)in>=65 && (int)in<=90)
countArray[1]++; //대문자 증가
else if((int)in>=97 && (int)in<=122 )
countArray[0]++; //소문자 증가
else if((int)in>=48 && (int)in<=57)
countArray[2]++; //숫자 증가
else if((int)in==' ')
countArray[3]++; //공백 증가
}
System.out.println(countArray[0]+" "+countArray[1]+" "+countArray[2]+" "+countArray[3]);
}
}
}
사실 주석을 다 써놔서 풀이할 내용이 없다만, 혹시나 착오가 생길 수 있는 부분과 팁이라면 팁인 부분은
한줄씩 읽어 분리한 후 , charAt()으로 한 문자씩 떼어서 if문으로 비교하는 과정에서
10진수 숫자가 아니라 '문자'로 비교연산자로도 가능하다
ex) in>='a'
내 코드는 소문자 대문자 판별 순서가 반대로 되있는데 아스키코드 10진법으로 비교하는게 편해서... ㅎㅎ
반복문 안에 각 갯수를 저장하는 배열을 자동 초기화하게 하고 갯수 카운트 후 바로 해당 줄의 종류별 갯수를 출력한다
'Programming Language > JAVA' 카테고리의 다른 글
[JAVA] 백준 문제풀이(9733번 : 꿀벌) (0) | 2022.12.06 |
---|---|
[JAVA] 백준 문제풀이(9625번 : BABBA) (0) | 2022.11.29 |
[JAVA] 백준 문제풀이(1252번 : 팰린드롬수) (0) | 2022.06.05 |
[JAVA] 백준 문제풀이 (15351번: 인생 점수) (0) | 2022.06.04 |
[자바] BigInteger 문제(feat. 백준 1271번) (0) | 2021.07.24 |