목표
알파벳 대소문자로 이루어진 단어가 주어졌을 때, 이 단어에서 가장 많이 사용된 알파벳이 무엇인지 알아내는 프로그램을 작성해야합니다.
문제
입력 첫째 줄에 알파벳 대소문자로 이루어진 단어가 주어집니다. 이 단어의 길이는 백만을 넘지 않습니다.
출력 첫째 줄에 이 단어에서 가장 많이 사용된 알파벳을 대문자로 출력합니다. 단, 가장 많이 사용된 알파벳이 여러 개 존재할 경우 ?를 출력시킵니다.
예를 들면 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]));
}
}
}