코딩테스트 (C#)

백준 1157 : 단어 공부

UniCoti-sub 2024. 12. 10.
반응형
문제 사진

 
이번 문제는 이해하기 쉽다. 어떤 문자가 주어지면 그중에서 가장 빈도수가 큰 알파벳을
출력하면 해결되는 문제이다. 만약 그런 알파벳이 여러개일 경우 ?를 출력해주면 된다고 한다.
이해는 쉬운 문제라서 다행인 것 같고,
 
원리는 A-Z까지 배열을 만든 다음 빈도를 계산해서 넣고 그를 기반으로 해서
최빈값 중복 검사(?출력시)와 최빈 알파벳 찾기를 수행하면 될 것 같다.

using System;

class Program {
    static void Main() {
        string input = Console.ReadLine() ?? "";
        int[] count = new int[26]; // A-Z의 개수

        // 대문자로 변환하여 카운트
        foreach (char c in input.ToUpper()) {
            if (char.IsLetter(c)) { // 알파벳인지 확인
                count[c - 'A']++;
            }
        }

        int maxCount = 0;
        char maxChar = '?';
        bool isDuplicate = false;

        // 최대값 찾기
        for (int i = 0; i < count.Length; i++) {
            if (count[i] > maxCount) {
                maxCount = count[i];
                maxChar = (char)(i + 'A');
                isDuplicate = false; // 새로운 최대값이므로 중복 아님
            } else if (count[i] == maxCount) {
                isDuplicate = true; // 중복 발생
            }
        }

        // 결과 출력
        Console.WriteLine(isDuplicate ? '?' : maxChar);
    }
}

 
솔직히 ai의 도움을 조금 받았다. 
처음에는 내 맘대로 해보고 있었는데 오늘은 시간이 넉넉치 않아서..
대문자로 변환하여 카운트를 해주고 배열에 저장한다.
 
중복검사를 위한 변수들을 추가해주고, 최댓값을 찾은 이후
중복이 발생했는지 삼항연산자를 통해 ?출력을 결정하고 아니면
찾은 최대 빈도 알파벳을 출력한다.


오늘의 느낀점)

대소문자 구분하는 코드는 거의 써보지 못했는데 이번 기회에 배운 것 같고 시간이 없으니까 로직이 완벽하진 않은 것 같다. 원래 구상했던 로직도 나름 마음에 들었었는데.. 시간만 많았다면 그쪽으로 해봤을 것 같아 아쉽다.


이상으로 도움이 되었길 바라며,
 
끝.

반응형

댓글