
주어진 단어를 입력받아서 가장 많이 나온 문자를 출력하는 문제이다.
이 문제의 핵심은
int 자료형으로 반환된다.char 는 사칙연산과 함께 쓰이면 int로 형변환되버림 <--명시적으로 char로 형변환해주기.정도인 것 같다.
#include <iostream>
#include <string>
#include <cctype>
using namespace std;
int arr[26];
int flag = 0;
int max_idx;
int main() {
string s;
cin >> s;
int max = -1;
for(char c : s) {
arr[toupper(c)-'A']++;
}
for(int i = 0; i< 30; i++) {
if(arr[i]>max) {
max=arr[i];
flag = 0;
max_idx=i;
} else if (arr[i]==max) flag = 1;
}
flag == 0 ? cout << char(max_idx + 'A') : cout << "?";
}
string으로 입력 받고 -> 각각을 대문자로 통일시켜서 - 'A' 해줌으로써 몇 번째 알파벳인지를 구하고 -> 이를 인덱스로 사용해서 배열에 각 알파벳의 등장 횟수를 누적시키며 -> 등장 횟수 배열을 완성시킨다.
이후 배열을 순회하며 최댓값, 최댓값의 index를 찾고, 등장 횟수가 같은 경우 flag를 set시킨다.
마지막으로 flag를 확인해서 0이면 가장 많이 등장한 문자를 대문자로 출력하고, 1이면 ?를 출력한다.
이때, 주의 할점은 char 는 사칙연산과 함께 쓰이면 int로 형변환된다.
따라서 char(max_idx + 'A') 처럼 명시적으로 형 변환을 수행해줘야한다.
#include <stdio.h>
#include <string.h>
char a[1000005];
int arr[26];
int main(){
int max = 0;
int size;
char ans;
scanf("%s",a);
size = strlen(a);
for(int i=0;i<size;i++)
if(a[i]>='a') arr[a[i]-'a']++;
else arr[a[i]-'A']++;
for(int i=0;i<26;i++)
if(arr[i]==max){
ans = '?';
}
else if(arr[i]>max){
max = arr[i];
ans = 'A'+i;
}
printf("%c",ans);
return 0;
}
위 풀이에서는 내 코드와 본질적인 해법은 동일하다.
그러나 2가지가 다르다.
(1) 알파벳 등장 횟수 카운트 방식
나는 모든 알파벳을 대문자로 통일했다. 그러나 이 풀이에서는
for(int i=0;i<size;i++)
if(a[i]>='a') arr[a[i]-'a']++;
else arr[a[i]-'A']++;
이런식으로 알파벳의 아스키코드가 'a'보다 클때, 작을때를 나누어서 별도로 인덱스를 구해서 알파벳 등장 횟수를 카운트했다.
(2) 출력 방식
이 코드는 출력할때 플래그를 따로 만들지않고 ans 변수에 그냥 ? 든 아스키 코드든 저장 시켜 버린다.
효율적인 코드인듯하다
toupper() 또는 tolower() 를 쓰려면 <cctype>을 include 해줘야한다.toupper() 또는 tolower() 는 int로 아스키코드를 반환하므로 char로 형변환해서 사용해야한다.char(toupper('a')) 이런식으로써야 'A' 이다.int로 받는데, 내가 char를 줘도 int로 자동 형변환이 되므로 관계없다.