알고리즘 문제 풀이

정올 1516 단어 세기 (JAVA 자바)

superbono 2021. 6. 21. 15:28

문제 출처 - http://jungol.co.kr/bbs/board.php?bo_table=pbank&wr_id=788&sca=2050 

 

JUNGOL

 

www.jungol.co.kr

 

문제

임의의 문장을 입력받아 각 단어별로 나눈 후에 단어들의 중복되는 개수를 구하는 프로그램을 작성하시오.

 

<처리조건>

(1) 입력된 스트링은 글자의 제한은 없다. 즉, 알파벳 대.소문자, 공백, ', ' 등도 입력으로 들어 올 수 있다. 

(2) 입력된 문장에서 각 단어사이의 구분은 공백으로 한다. 

(3) 단어에는 공백을 제외한 모든 문자들이 포함된다.​ 

 

입력형식

임의의 문장을 입력받는다.(문장의 길이는 200 이하)

하나의 결과가 나온 후에도 계속 새로운 입력을 받다가, "END"가 입력되면 프로그램을 종료한다. (문장의 개수를 30을 넘지 않는다.)

 

 

출력형식

 

각 문장 단위로 단어들의 발생 빈도를 오름차순 크기(아스키코드)순으로 출력한다.

 

문제 유형

문자열

 

코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Collections;
import java.util.SortedMap;
import java.util.StringTokenizer;
import java.util.TreeMap;

public class JO1516_단어세기 {
	static SortedMap<String, Integer> list;
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		while(true) {
			String tmp = br.readLine();
			if(tmp.equals("END")) break;
			StringTokenizer st = new StringTokenizer(tmp, " ");
			
			list = new TreeMap<>();
			while(st.hasMoreTokens()) {
				String s = st.nextToken();
				if(list.containsKey(s)) {
					int cnt = list.get(s);
					list.put(s, ++cnt);
				}else {
					list.put(s, 1);
				}
			}
			for (String key : list.keySet()) {
				System.out.println(key + " : " + list.get(key));
			}
		}
		
	}
}

 

문자열 문제를 잘 못푸는데 문자열을 연습할 수 있는 문제였고 map에 대해서도 공부할 수 있는 문제였다.

문제를 꼼꼼히 읽지 않아 END를 입력하면 더이상 입력을 받지 않고 프로그램이 종료된다는 점을 놓쳤고, ++연산자를 쓸 때 cnt++ 이렇게 뒤에 붙이는게 더 익숙해서 그런지 아무 생각 없이 그냥 cnt++하는 습관이 있는데 이러한 안좋은 버릇 때문에 틀렸었다.

좀 더 생각하고 코드를 짜야한다는 것을 다시금 상기시킨 문제이다.