Dev Hyeri

◖코딩 테스트◗▬▬▬▬▬▬▬▬▬/백준

[백준](2024) 단어 공부 (설명/코드/정답)

_hyeri 2024. 2. 19. 23:19

 

문제 링크 : https://www.acmicpc.net/problem/1157

 

 

난이도
알고리즘 
브론즈1 구현, 문자열

 

 

 

1. 요구 사항 이해

시간, 메모리 제한 : 2초 / 128MB

 

대소문자가 섞인 단어에서 가장 많이 사용된 알파벳 식별 후 대문자로 출력

단어의 길이는 1,000,000 넘지 않음 

빈도수가 가장 높은 알파벳이 여러개인 경우 '?' 출력 

 

 

 

 

2. 설계/검증 

 

소문자와 대문자는 같은 알파벳인 경우 하나로 처리 

- toUpperCase() 로 전부 대문자 처리 

가장 빈도 높은 알파벳과 그 빈도 수를 저장할 변수

 

 

시간 복잡도  최악의 경우  공간 복잡도
O(N) 1,000,000 O(1)

 

 

함수화

String word;


private static void findMostFrequentAlphabet(w){


}

 

 

 

 

3. 정상 코드

import java.util.*;

public class Main {

    // 주어진 문자열에서 가장 빈도가 높은 알파벳을 찾는 메서드
    private static void findMostFrequentAlphabet(String w){
        // 알파벳의 등장 빈도를 저장할 배열 초기화
        int[] alphabetCount  = new int[26];
        // 문자열을 순회하며 각 알파벳의 등장 횟수를 계산
        for (int i = 0; i < w.length(); i++) {
            char currentChar = w.charAt(i);
            alphabetCount[currentChar - 'A']++;
        }
        // 가장 빈도가 높은 알파벳과 그 빈도 수를 저장할 변수 초기화
        char maxChar = '?';
        int maxCount = 0;
        // 알파벤 빈도 배열을 순회하며 가장 빈도가 높은 알파벳 찾기
        for (int i = 0; i < alphabetCount.length; i++) {
            if (alphabetCount[i] > maxCount) {
                maxCount = alphabetCount[i];
                maxChar = (char)('A' + i);
            } else if (alphabetCount[i] == maxCount) {
                maxChar = '?';
            }
        }
        System.out.println(maxChar);
    }

    public static void main(String[] args) {

        // 사용자로부터 입력 받은 단어를 대문자로 변환하여 저장
        Scanner scan = new Scanner(System.in);
        String word = scan.next().toUpperCase();

        scan.close();
        // 가장 빈도 높은 알파벳을 찾는 메서드 호출
        findMostFrequentAlphabet(word);
    }
}

 

 

 

 

4. 처리 과정 추적 코드

import java.util.*;

public class Main {

    // 주어진 문자열에서 가장 빈도가 높은 알파벳을 찾는 메서드
    private static void findMostFrequentAlphabet(String w) {
        // 알파벳의 등장 빈도를 저장할 배열 초기화
        int[] alphabetCount = new int[26];
        System.out.printf("\n------------------------\n");
        System.out.println("알파벳 카운트 배열 초기화: " + Arrays.toString(alphabetCount));
        // 문자열을 순회하며 각 알파벳의 등장 횟수를 계산
        for (int i = 0; i < w.length(); i++) {
            char currentChar = w.charAt(i);
            alphabetCount[currentChar - 'A']++;
            System.out.printf("현재 처리하는 문자: %c\n", currentChar);
            System.out.println("알파벳 카운트 배열: " + Arrays.toString(alphabetCount));
        }
        // 가장 빈도가 높은 알파벳과 그 빈도 수를 저장할 변수 초기화
        char maxChar = '?';
        int maxCount = 0;
        // 알파벤 빈도 배열을 순회하며 가장 빈도가 높은 알파벳 찾기
            System.out.printf("\n------------------------\n");
        for (int i = 0; i < alphabetCount.length; i++) {
            if (alphabetCount[i] > maxCount) {
                maxCount = alphabetCount[i];
                maxChar = (char) ('A' + i);
                System.out.printf("현재 최다빈도 알파벳: %c\n", maxChar);
                System.out.printf("현재 최다빈도 알파벳 빈도 수: %d\n", maxCount);
            } else if (alphabetCount[i] == maxCount) {
                maxChar = '?';
            }
        }
        System.out.println("결과  : " + maxChar);
    }

    public static void main(String[] args) {

        // 사용자로부터 입력 받은 단어를 대문자로 변환하여 저장
        Scanner scan = new Scanner(System.in);
        System.out.printf("단어 입력: ");
        String word = scan.next().toUpperCase();

        scan.close();
        // 가장 빈도 높은 알파벳을 찾는 메서드 호출
        findMostFrequentAlphabet(word);
    }
}

 

 

 

 

추가 정리

 

Arrays.toString(count)

배열을 출력할 때 사용하는 함수 

 

toUpperCase()

소문자를 대문자로 변환하는 함수