이 문제도 풀면서 GPT 에게 물어보았다.

Stream 예제를 눈으로 많이 익히기 위해서, 먼저 시도를 해보고 물어봤는데.

 

처음에는 Stream.of 로 arrays 를 string 으로 바꾸려고 했는데.. new String() 이라는 쉬운 방법이 있다니 충격.

 

처음부터 Map 자료형을 떠올리긴 했었는데, 중복제거나 이런 부분이 머리가 아파오기 시작하면서 for 문으로 시도하였으나, 

 

이중for 문에 if 가 들어가고, 케이스가 많아지면서 복잡해져서 포기했다.

 

new String(arrays) : char[] 를 String 으로 변환

chars() : String 에서 요소를 intStream 으로 변환

mapToObj(c -> (char) c ) : c 는 intStream 으로 변환된 ascii 코드의 문자 정수이며, (char) c 로 문자로 변환

filter : (Charater::isLetterOrDigit) : Charater 중에 영어문자 도는 숫자만 필터링

collect() : 스트림의 요소를 수집하여, 반환하며 어떻게 처리하고 반환할지 정의

Collectors.groupingBy() : 스트림 요소를 그룹화

 

Collections / Collectors 이런거 자주 사용되는데 따로 찾아봐야겠다.

package org.example;

import java.util.*;
import java.util.stream.Collectors;

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

        // 단어 입력 받는다.
        String word = sc.nextLine().toUpperCase();

        char[] arrays = word.toCharArray();

        Map<Character, Long> charFrequency = new String(arrays)
                .chars()
                .mapToObj(c -> (char) c)
                .filter(Character::isLetterOrDigit)
                .collect(Collectors.groupingBy(
                        Character::toUpperCase,
                        Collectors.counting()
                ));

        long maxFrequency = charFrequency.values().stream()
                .max(Long::compare)
                .orElse(0L);

        String mostFrequentChars = charFrequency.entrySet().stream()
                .filter(entry -> entry.getValue() == maxFrequency)
                .map(entry -> entry.getKey().toString())
                .collect(Collectors.joining());

        if (mostFrequentChars.isEmpty() || mostFrequentChars.length() > 1) {
            System.out.println("?");
        } else {
            System.out.println(mostFrequentChars);
        }
    }
}