2019. 3. 3. 17:19
문제링크: https://www.acmicpc.net/problem/1152
# 문제
영어 대소문자와 띄어쓰기만으로 이루어진 문자열이 주어진다. 이 문자열에는 몇 개의 단어가 있을까? 이를 구하는 프로그램을 작성하시오. 단, 한 단어가 여러 번 등장하면 등장한 횟수만큼 모두 세어야 한다.
# 입력
첫 줄에 영어 대소문자와 띄어쓰기로 이루어진 문자열이 주어진다. 이 문자열의 길이는 1,000,000을 넘지 않는다. 단어는 띄어쓰기 한 개로 구분되며, 공백이 연속해서 나오는 경우는 없다. 또한 문자열의 앞과 뒤에는 공백이 있을 수도 있다.
# 출력
첫째 줄에 단어의 개수를 출력한다.
# 예제 입력 1
The Curious Case of Benjamin Button
# 예제 출력 1
6
###########################################################
풀이1
1. 문자열을 입력받아서 split(" ")한다.
2. split 결과의 배열을 체크해서 공백이 아닌 경우만 카운팅한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | public class Main { public static void main(String[] args) throws FileNotFoundException { Scanner sc = new Scanner(System.in); int strCount=0; String inputStr = sc.nextLine(); String strArr[] = inputStr.split(" ");; for (int i=0; i<strArr.length; i++) { if (strArr[i].equals("") != true) { strCount++; } } System.out.println(strCount); sc.close(); } } | cs |
풀이2
1. 문자열을 입력받아서 문자들을 모두 체크한다.
2. 문자의 아스키코드 범위값을 체크해서 연속된 문자열이면 카운팅하지 않는다.
(즉 초기 한번만 카운팅)
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 | public class Main { static int getStringCount(String inputStr) { int count=0; int wordFlag=0; for (int i=0; i<inputStr.length(); i++) { char temp = inputStr.charAt(i); if (wordFlag == 0) { if ((temp >= 'A' && temp <='Z') || (temp >= 'a' && temp <='z')) { count++; wordFlag = 1; } } if (temp == ' ') { wordFlag = 0; } } return count; } public static void main(String[] args) throws FileNotFoundException { Scanner sc = new Scanner(System.in); String inputStr = sc.nextLine(); System.out.println(getStringCount(inputStr)); sc.close(); } } | cs |
# 회고
split, trim, isEmpty 사용법을 학습하자
# 다른 정답 참고
https://rightbellboy.tistory.com/40
https://zoonvivor.tistory.com/126