c# 백준 1157 단어공부
문제
알파벳 대소문자로 된 단어가 주어지면, 이 단어에서 가장 많이 사용된 알파벳이 무엇인지 알아내는 프로그램을 작성하시오. 단, 대문자와 소문자를 구분하지 않는다.
입력과 출력
첫째 줄에 알파벳 대소문자로 이루어진 단어가 주어진다. 주어지는 단어의 길이는 1,000,000을 넘지 않는다.
출력은 다음과 같다.
첫째 줄에 이 단어에서 가장 많이 사용된 알파벳을 대문자로 출력한다. 단, 가장 많이 사용된 알파벳이 여러 개 존재하는 경우에는 ?를 출력한다.
풀이 과정
int배열
을 통해 알파벳마다 문자열에 알파벳이 등장한 횟수
를 저장하였고,
저장하는 방법은 대문자와 소문자를 아스키코드를 통해 구분하지 않고 판별
하여 수행했다.
마지막으로 int배열
을 순회하며 최대 횟수를 비교하여 최종 출력할 문자를 결정하였다.
전체 코드
class Program
{
static void Main(string[] args)
{
// 알파벳마다 알파벳이 나온 개수를 저장해둘 배열
// 0번방은 A ... 25번방은 Z
int[] alphabet = new int[26];
string s = Console.ReadLine();
char[] c = s.ToCharArray();
for (int i = 0; i < c.Length; i++)
{
// 65~90 알파벳 대문자 97~122 알파벳 소문자
// 아스키 코드로 변환
int ASCII = Convert.ToInt32(c[i]);
// 대문자라면
if(65 <= ASCII && ASCII <= 90)
{
alphabet[ASCII - 65] += 1;
}
// 소문자라면
else if (97 <= ASCII && ASCII <= 122)
{
alphabet[ASCII - 97] += 1;
}
}
char print = ' '; // 출력할 문자
int max = 0; // 최대 값 비교를 위한 변수
for (int i = 0; i < alphabet.Length; i++)
{
if(max < alphabet[i])
{
max = alphabet[i];
print = (char)(i + 65);
}
else if(max == alphabet[i])
{
print = '?';
}
}
Console.WriteLine(print);
}
}
추가로 알아낸 점
다른 분들의 경우 string에 내장된 ToUpper()
함수나 ToLower()
함수를 통해 대문자나 소문자로 통일하고 문재를 해결하였다.
또한 문자열을 판별할 때 아스키코드에 해당하는 숫자로 비교하는 것이 아닌 바로 문자로 비교
하는 분들도 많았다.
내 코드를 이것들을 이용해 수정하면 다음과 같다.
class Program
{
static void Main(string[] args)
{
// 알파벳마다 알파벳이 나온 개수를 저장해둘 배열
// 0번방은 A ... 25번방은 Z
int[] alphabet = new int[26];
// 대문자 통일
string s = Console.ReadLine().ToUpper();
char[] c = s.ToCharArray();
for (int i = 0; i < c.Length; i++)
{
// 65~90 알파벳 대문자
// 아스키 코드로 변환
if('A' <= c[i] && c[i] <= 'Z')
{
alphabet[c[i] - 'A'] += 1;
}
}
char print = ' '; // 출력할 문자
int max = 0; // 최대 값 비교를 위한 변수
for (int i = 0; i < alphabet.Length; i++)
{
if(max < alphabet[i])
{
max = alphabet[i];
print = (char)(i + 'A');
}
else if(max == alphabet[i])
{
print = '?';
}
}
Console.WriteLine(print);
}
}
댓글남기기