728x90
#include <iostream>
#include <string>
using namespace std;
int main() {
string c;
char ch;
int arr[27]={0,}, max1=0, max2=0, idx1, idx2;
cin>>c;
for(int i=0; c[i]!='\0'; i++) //1)
{
if(c[i]>=97) //대문자, 소문자를 알파벳의 개수를 세주는 배열에 집어넣는다 2)
arr[c[i]-97]++;
else
arr[c[i]-65]++;
}
for(int i=0; i<26; i++) //3)
{
if(arr[i]>=max1)
{
max1=arr[i];
idx1=i;
}
}
for(int i=0; i<26; i++) //4)
{
if(i==idx1) //4-1)
continue;
if(arr[i]>=max2)
{
max2=arr[i];
idx2=i;
}
}
if(max1>max2) //5)
ch=idx1+65;
else if(max1==max2) //6)
ch='?';
cout<<ch;
}
1) 입력받은 문자의 길이만큼 반복
- stelen을 사용하여도 좋지만, 가끔 헤더에 cstring을 선언하기 귀찮아서 저렇게 쓴다.
- 문자 배열은 초기화를 하지 않는다면 '\0'이 초기값이기떄문에 저렇게 쓴 것이다.
2) 아스키 코드값
- (https://namu.wiki/w/%EC%95%84%EC%8A%A4%ED%82%A4%20%EC%BD%94%EB%93%9C) <꺼무위키>
- 알파벳의 개수(26)대로 선언한 배열에 0번 방은 a의 개수, 1번 방은 b의 개수... 세준다.
3) 가장 개수가 많은 알파벳을 하나 골라낸다. <하지만 하나만 구해서는 문제를 풀 수 없기에 4번으로 넘어간다>
4) 한 번 더 가장 많은 알파벳을 고르고 그 개수를 max1에 저장한다.
4-1) 중복되는 것을 막기 위해 3번에서 구한 가장 수가 많은 알파벳(max1)의 인덱스(idx1)를 제외한다.
5) 첫 번째로 개수를 구한 게 더 크다면 max1이 가장 많은 개수를 가지고 있으므로 그 문자를 아스키코드를 이용해 문자 배열에 담아준다.
6) 첫 번째로 구한 개수와, 두 번째로 구한 개수가 같다면 가장 큰 녀석은 존재하지 않으므로 ?를 문자 변수에 담아준다.
평가> 조금 더러운 것 같지만 단순 무식해서 좋은 것 같다
728x90
'알고리즘 > 문제' 카테고리의 다른 글
[백준] 17608. 막대기 <C++> (0) | 2020.04.16 |
---|---|
[백준] 10798. 세로읽기 <C++> (1) | 2020.04.16 |
[백준] 14563. 완전수 <C++> (0) | 2020.04.14 |
[백준] 10804. 카드 역배치 <C++> (0) | 2020.04.14 |
[백준] 1244. 스위치 켜고 끄기 <C++> (0) | 2020.04.13 |
댓글