공log/[P&B]

[P&B] #60 BAEKJOON 1157

ming_OoO 2023. 9. 17. 23:53
728x90

백준 1157번 단어 공부

문제 설명

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

 

입력

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

 

출력

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

 

나의 문제 풀이 코드

import java.util.*;
import java.io.*;

public class bj1157 {
    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 s = br.readLine();
        s = s.toUpperCase();

        Map<String, Integer> alphabet = new HashMap<>();
        for (String word : s.split("")) {
            int pValue = alphabet.getOrDefault(word, 0);
            alphabet.put(word, pValue + 1);
        }

        int[] arr = alphabet.values().stream().mapToInt(Integer::intValue).toArray();
        int max = 0;
        String answer ="";
        for (int i = 0; i < arr.length; i++) {
            if (max == arr[i])
                answer = "?";
            else if (max<arr[i]){
                max = arr[i];
                for(String key : alphabet.keySet()) {
                    // 키와 매핑된 값이랑 equals() 메서드에 전달된 값이랑 일치하면 반복문을 종료합니다.
                    if(alphabet.get(key).equals(max)) { // 키가 null이면 NullPointerException 예외 발생
                        answer = key;
                        break;
                    }
                }
            }
        }
        bw.write(answer);
        bw.flush();

    }
}

 

문제 풀이 코멘트

코드를 설명하기에 앞서 Map과 Set에 대한 설명이 필요할 것 같다.

Map
Map은 키(Key)와 값(Value)을 연관시키는 데이터 구조입니다. 각 키는 고유해야 하며, 하나의 키는 하나의 값을 가집니다.
Java에서 Map은 인터페이스이며, 다양한 구현체가 있습니다. 이 코드에서는 HashMap을 사용하고 있습니다.
HashMap은 키-값 쌍을 저장하며, 특정 키를 사용하여 값을 검색할 수 있습니다.

Set
Set은 중복을 허용하지 않는 데이터 집합을 나타내는 인터페이스입니다.
Java에서 Set은 인터페이스이며, 다양한 구현체가 있습니다. 이 코드에서는 HashSet을 사용하지는 않았지만, HashSet은 가장 일반적으로 사용되는 Set 구현체 중 하나입니다.

먼저 s.toUpperCase()로 입력받은 문자열을 모두 대문자로 변환합니다. 이렇게 하는 이유는 대소문자를 구분하지 않고 알파벳을 세기 위함입니다. 그 다음 알파벳과 그 등장 횟수를 저장할 HashMap 객체를 생성합니다. 키는 알파벳 문자열, 값은 등장 횟수를 나타내는 정수입니다.
alphabet.getOrDefault(word, 0)메서드를 사용하여 word에 해당하는 값(알파벳 문자열)이 alphabet 맵에서 이미 존재한다면 그 값을 가져오고, 없다면 기본값으로 0을 사용합니다. 그런 다음, alphabet 맵에 word를 키로 하고, 현재 등장 횟수에 1을 더한 값을 저장합니다.
alphabet.values().stream().mapToInt(Integer::intValue).toArray()는 조금 복잡한 메서드의 조합인데 alphabet 맵의 Integer값들을 int 배열로 변환합니다. 이 배열은 각 알파벳의 등장 횟수를 나타냅니다.
배열 arr을 순회하면서 현재 알파벳의 등장 횟수가 max와 같다면, answer를 물음표로 설정합니다. 이는 가장 많이 등장한 알파벳이 여러 개인 경우를 처리합니다. 현재 알파벳의 등장 횟수가 max보다 큰 경우, max를 현재 알파벳의 등장 횟수로 업데이트하고 아래의 반복문을 실행합니다.
for (String key : alphabet.keySet())는 alphabet 맵의 키를 순회하면서 현재 키와 매핑된 값이 max와 같은 경우 (alphabet.get(key).equals(max)), answer를 현재 키로 설정하는 것을 반복합니다.

 

Map과 Map의 메서드들을 잘 활용할 수 있어야 풀기 쉬운 문제였습니다.

728x90