모름

목표

알파벳 대소문자로 이루어진 단어가 주어졌을 때, 이 단어에서 가장 많이 사용된 알파벳이 무엇인지 알아내는 프로그램을 작성해야합니다.

 

 

 

문제

입력 첫째 줄에 알파벳 대소문자로 이루어진 단어가 주어집니다. 이 단어의 길이는 백만을 넘지 않습니다.

 

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

 

예를 들면 Mississipi를 입력하면 많이 사용된 알파벳이 여러 개 이므로 ?가 출력되야합니다. a가 입력된다면 A가 출력됩니다.

 

 

 

풀이

(0) 먼저 간단하게 어떻게 풀지 생각한 것을 적어보겠습니다. (1) 입력받은 문자를 다 소문자 혹은 대문자로 통일 시킨후 (2) 각 알파벳을 배열에 차근차근 집어넣는다. (3) 가장 많은 수를 가진 배열을 대문자로 출력한다.

 

 

 

string someWord = Console.ReadLine();

먼저 알파벳 대소문자로 이루어진 단어를 입력받습니다.

 

 

 

string upperSomeWord = someWord.ToUpper();

일단, 알파벳을 계산하기 쉽게 대문자로 다 변환시켜줍니다. 참고로 소문자로는 ToLower() 함수를 쓰면 변환시킬 수 있습니다.

 

*(1) 입력받은 문자를 다 소문자 혹은 대문자로 통일 시킨다를 만족했습니다.

 

 

 

int[] upperAlphabet = new int[26];
int upperAlphabetAscii = 65;

for (int i = 0; i < 26; i++)
{
    upperAlphabet[i] = upperAlphabetAscii;
    upperAlphabetAscii++;
}

대문자 알파벳을 카운트할 배열을 만들었습니다. 대문자 알파벳은 총 26개이기때문에 배열의 크기도 26입니다. 차례대로 아스키코드로 대문자 A부터 Z까지 배열에 남아줍니다.

 

 

 

char[] someWordSpelling = upperSomeWord.ToCharArray();
int[] count             = new int[26];

이어서 입력받은 단어의 스펠링을 배열로 받습니다. 앞서 만든 대문자 A부터 Z까지 비교할 것입니다. 이후 count값을 넣어줄 배열을 만들어줍니다. count는 대문자와 단어의 스펠링이 동일할때마다 체크될겁니다.

 

 

 

for (int i = 0; i < count.Length; i++)
{
    count[i] = 0;

    for (int j = 0; j < someWordSpelling.Length; j++)
    {
        if (upperAlphabets[i] == Convert.ToInt32(someWordSpelling[j]))
        {
            count[i]++;
            Console.WriteLine("count[{0}] : {1}", i,count[i]);
        }
    }
}

이어서 for문을 통해 대문자(upperAlphabets[i])스펠링(someWordSpelling[j])이 동일한지 비교하여 동일한 대문자의 인덱스를 카운트에 더해줍니다.

 

 

 

정상적으로 카운트가 되고 있습니다. 이제 카운트의 26개의 인덱스 중 가장 많이 카운트 된 인덱스를 찾아서 그에 맞는 대문자를 출력하기만 하면됩니다.

 

 

 

int maxValue = count[0];
int maxCountIndex = 0;

for (int i = 0; i < count.Length; i++)
{
    if(maxValue < count[i])
    {
        maxValue = count[i];
        maxCountIndex = i;
    }
}

최대값의 인덱스를 구하는 코드를 짰습니다.

 

 

 

Console.WriteLine(Convert.ToChar(upperAlphabets[maxCountIndex]));

마지막으로 앞선 결과를 가지고 출력을 해주면 가장 많이 쓰인 대문자를 확인 할 수 있습니다.

 

 

 

결과(1)

많이 쓰인 알파벳을 출력해주지만, 아직 개수가 서로 똑같은 경우에 대해 처리를 안해줬네요.

 

 

 

bool isThereSameNum = false;

for (int i = 0; i < count.Length; i++)
{
    for (int j = 0; j < count.Length; j++)
    {
        if(count[i] == maxValue && count[i] == count[j] && i != j)
        {
            isThereSameNum = true;
        }
    }
}

count[]에 똑같은 큰 수가 존재하는지 판별합니다.

 

 

 

if(isThereSameNum)
    Console.WriteLine("?");
else
    Console.WriteLine(Convert.ToChar(upperAlphabets[maxCountIndex]));

마지막으로 불값을 통해 값은 값이 존재할 경우 ?를 출력해줬습니다.

 

 

 

결과(2)

이상입니다. 알파벳이 많은 수에 대해서도 처리를 해줬습니다.

 

다른 분들은 훨씬 깔끔하게 푸신 것 같습니다. (ㅜ_ㅜ) 이중포문을 사용하지 않는게 일반적인 모양입니다.

 

 

 

코드 전문 더보기

...더보기
using System;

namespace Backjoon_7_5_1157_wordStudy {
    class Program {
        static void Main(string[] args)
        {
            string someWord         = Console.ReadLine();
            string upperSomeWord    = someWord.ToUpper();

            int[] upperAlphabets    = new int[26];

            int upperAlphabetAscii  = 65;

            for (int i = 0; i < 26; i++)
            {
                upperAlphabets[i]   = upperAlphabetAscii;
                upperAlphabetAscii++;
            }

            char[] someWordSpelling = upperSomeWord.ToCharArray();
            int[] count             = new int[26];

            for (int i = 0; i < count.Length; i++)
            {
                count[i] = 0;

                for (int j = 0; j < someWordSpelling.Length; j++)
                {
                    if (upperAlphabets[i] == Convert.ToInt32(someWordSpelling[j]))
                    {
                        count[i]++;
                    }
                }
            }

            int maxValue = count[0];
            int maxCountIndex = 0;

            for (int i = 1; i < count.Length; i++)
            {
                if (maxValue < count[i])
                {
                    maxValue = count[i];
                    maxCountIndex = i;
                }
            }


            bool isThereSameNum = false;

            for (int i = 0; i < count.Length; i++)
            {
                for (int j = 0; j < count.Length; j++)
                {
                    if(count[i] == maxValue && count[i] == count[j] && i != j)
                    {
                        isThereSameNum = true;
                    }
                }
            }

            if(isThereSameNum)
                Console.WriteLine("?");
            else
                Console.WriteLine(Convert.ToChar(upperAlphabets[maxCountIndex]));
        }
    }
}