[백준] 1157, 대/소문자 입력 , 가장 많이 등장한 알파벳 출력하기

YUN·6일 전

C++

목록 보기
40/50

주어진 단어를 입력받아서 가장 많이 나온 문자를 출력하는 문제이다.

이 문제의 핵심은

  • 알파벳은 총 26개이다. (소문자 26개, 대문자 26개)
  • 입력이 소/대문자 섞여서 등장하니 소문자 or 대문자로 통일시키기
  • 배열의 데이터로 각 알파벳의 등장 횟수 카운트하기
  • 몇 번째 알파벳인지는 char - 'A' 로, 어떤 알파벳인지는 char('A' + index) 로 구하기
    • 가령 C가 몇 번째 알파벳인지는 'C' - 'A'로 구하고, index=2 일때 어떤 문자인지 구하려면 'A' + index 를 해주면 'C'에 해당하는 아스키코드가 int 자료형으로 반환된다.
  • char 는 사칙연산과 함께 쓰이면 int로 형변환되버림 <--명시적으로 char로 형변환해주기.

정도인 것 같다.

1. 나의 풀이

#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') 처럼 명시적으로 형 변환을 수행해줘야한다.

2. 다른 풀이

#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 변수에 그냥 ?아스키 코드든 저장 시켜 버린다.

효율적인 코드인듯하다

3. 배운 점

(1) toupper() & tolower() 사용법

  • toupper() 또는 tolower() 를 쓰려면 <cctype>을 include 해줘야한다.
  • toupper() 또는 tolower()int아스키코드를 반환하므로 char로 형변환해서 사용해야한다.
    • 예를들어 char(toupper('a')) 이런식으로써야 'A' 이다.
  • 인자는 원래는 int로 받는데, 내가 char를 줘도 int로 자동 형변환이 되므로 관계없다.
profile
안녕하세요. 전자공학부 학부생의 공부 기록입니다.

0개의 댓글