백준 1157번

 


 

1차 풀이 과정

1. Scanner로 문자열 입력

2. 각 문자와 개수를 저장할 Map 선언

3. Map에 대문자, 문자열로 변환한 값을 개수와 함께 저장

4. 최빈값 반환

5. 각 value값과 최빈값을 비교

5. 만약 이미 결과값으로 저장된 문자가 있다면 최빈 문자가 2개 이상인 걸로 판단하고 ? 출력

package baekjoon;

import java.util.*;

public class B1157 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String input = scanner.nextLine();

        Map<String, Integer> map = new HashMap<>();

        // toUpperCase
        // Map에 알파벳, 수량 입력
        for(int i = 0; i < input.length(); i++){
            // map.merge : key값이 존재하지 않으면 1, 존재하면 value+1 연산하여 put
            // charAt -> touppercase 가능
            map.merge(String.valueOf(input.charAt(i)).toUpperCase(), 1, Integer::sum);

        }

        //최대값 출력
        int max = Collections.max(map.values());

        //최빈 문자를 찾기 위해 entrySet 사용
        Set<Map.Entry<String, Integer>> entrySet = map.entrySet();
        String result = "";

        // 최빈값과 entrySet의 value 비교
        for(Map.Entry<String, Integer> entry : entrySet){
            if(entry.getValue()==max){
                if(!result.isEmpty()){
                    result = "?";
                    break;
                }
                result = entry.getKey();
            }
        }

        System.out.println(result);
    }
}

 

entrySet은 각 map의 key, value를 하나로 묶어서 set에 저장하는 방식이다.

entrySet을 사용하면 key와 value를 순서대로 각각 접근할 수 있다.

 


개선된 코드

튜터님의 코드 리뷰를 통해 불필요한 과정을 제거하는 리팩토링을 진행했다.

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String input = scanner.nextLine().toUpperCase();

        // 문자, 개수를 map에 저장
        Map<Character, Integer> map = new HashMap<>();

        for (int i = 0; i < input.length(); i++) {
            // key값이 존재하지 않으면 1, 존재하면 value+1 put
            map.merge(input.charAt(i), 1, Integer::sum);

        }

        //최빈값 반환
        int max = Collections.max(map.values());

        Character result = null;

        // 최빈값과 entrySet의 value 비교
        for (Map.Entry<Character, Integer> entry : map.entrySet()) {
            if (entry.getValue() == max) {
                if (result != null) {
                    result = '?';
                    break;
                }
                result = entry.getKey();
            }
        }

        System.out.println(result);
    }
}

 


결과