반응형
[ 문제 ]
영어에서는 어떤 글자가 다른 글자보다 많이 쓰인다. 예를 들어, 긴 글에서 약 12.31% 글자는 e이다.어떤 글이 주어졌을 때, 가장 많이 나온 글자를 출력하는 프로그램을 작성하시오.
[ 코드 ]
1. 내 코드: 딕셔너리 사용
- 입력값을 key로 저장하고 딕셔너리 keyvalue의 maxcount와 같은 값의 key를 리스트에 담고 출력
using System;
using System.Collections.Generic;
using System.Linq;
List<string> lines = new List<string>();
string line;
while ((line = Console.ReadLine()) != null)
{
lines.Add(line);
}
Dictionary<char, int> counts = CountC(lines);
List<char> Find = FindC(counts);
foreach (char c in Find)
{
Console.Write(c);
}
Dictionary<char, int> CountC(List<string> lines)
{
Dictionary<char, int> counts = new Dictionary<char, int>();
foreach (string line in lines)
{
foreach (char c in line)
{
if (char.IsLetter(c))
{
char letter = char.ToLower(c);
if (counts.ContainsKey(letter))
{
counts[letter]++;
}
else
{
counts[letter] = 1;
}
}
}
}
return counts;
}
List<char> FindC(Dictionary<char, int> counts)
{
int maxCount = counts.Max(kv => kv.Value);
List<char> C = counts.Where(kv => kv.Value == maxCount).Select(kv => kv.Key).OrderBy(c => c).ToList();
return C;
}
2. 다른 사람 코드 참고
- 배열에 a-z까지 횟수를 저장. 출력할때 i+'a'를 해서 char형으로 문자를 출력
var letters = new int[26];
int maxCount = 0;
string line;
while ((line = Console.ReadLine()) != null)
{
foreach (var c in line)
{
if (c >= 'a' && c <= 'z')
{
int i = c - 'a';
letters[i]++;
if (letters[i] > maxCount)
maxCount = letters[i];
}
}
}
for (int i = 0; i < 26; i++)
{
if (letters[i] == maxCount)
Console.Write((char)(i + 'a'));
}
[ 추가 ]
C#에서 Ctrl + z 하면 EOF가 실행됩니다.
while문에 line = Console.ReadLine()) != null이렇게 써도 여러줄 입력 받을 수 있다니... 무조건 while문을 true로 하고 안에 if문으로 EOF를 줬는데 새로 알게된 바보..
[ 실행화면 ]
문제링크: https://www.acmicpc.net/problem/1371
반응형
'Language > C#' 카테고리의 다른 글
[C#] 백준 1009번 분산처리 (0) | 2024.02.27 |
---|---|
[C#] 백준 9012번 괄호 (0) | 2024.02.26 |
[C#] 백준 10815번 숫자 카드 (0) | 2024.02.24 |
[C#] 백준 10773번 제로 (0) | 2024.02.24 |
[C#] 백준 2747번 피보나치 수 (0) | 2024.02.24 |