본문 바로가기
○ 기술면접/알고리즘

구현: 단어공부 (백준 1157)

by ZEROMI 2023. 3. 23.
728x90

○ 문제
알파벳 대소문자로 된 단어가 주어지면, 이 단어에서 가장 많이 사용된 알파벳이 무엇인지 알아내는 프로그램을 작성하시오. 단, 대문자와 소문자를 구분하지 않는다.

○ 입력
첫째 줄에 알파벳 대소문자로 이루어진 단어가 주어진다. 주어지는 단어의 길이는 1,000,000을 넘지 않는다.

○ 출력
첫째 줄에 이 단어에서 가장 많이 사용된 알파벳을 대문자로 출력한다. 단, 가장 많이 사용된 알파벳이 여러 개 존재하는 경우에는 ?를 출력한다.

○ 예제 입력
Mississipi
zZa

○ 예제 출력
?
Z


import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.IOException;
import java.util.HashMap;
import java.util.HashSet;

public class Main {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		
		String str = br.readLine().toUpperCase();
		char[] arr = str.toCharArray();
		
		//중복문자 제거 및 카운트
		HashMap<Character, Integer> map = new HashMap<>();
		HashSet<Character> set = new HashSet<>();
		for (char c : arr) {
			
			if (set.contains(c)) {
				map.put(c, map.get(c) + 1);
			} else {
				map.put(c, 1);
			}
			
			set.add(c);
			
		}
		
		//최대 값
		char maxKey = ' ';
		int max = 0;
		for (char key : map.keySet()) {
			int value = map.get(key);
			
			if (value > max) {
				maxKey = key;
				max = value;
			} else if (value == max) {
				maxKey = '?';
			
			}
		}
		
		bw.write(maxKey);
		
		bw.flush();
		bw.close();

	}
	
}

○ 확인
- Stream: 자료가 모여있는 배열, 컬렉션 등의 안에 있는 일련의 숫자를 처리하는 기능을 구현한 클래스
- stream을 통해 카운트 할 수도 있고, collections를 통해 중복 개수 세기 가능
- HashSet: Set 인터페이스의 구현 클래스, 순서가 없고 중복을 허용하지 않음.
- char는 primitive type이기 때문에 Stream으로 변경이 불가능하고 Wrapper class에 해당하는 Character를 써줘야 한다.
- toCharArray는 원시형에서만 쓸 수 있나봐..쥬륵..
- Map의 값 출력은 entrySet(), keySet() 메소드 사용 가능하고, entrySet()은 key, value 모두 필요할 때 사용한다. (람다도 가능)
- char 자료형은 ''로 초기화 불가, 일반적으로 공백 초기화 사용 => ' '

728x90