[코딩테스트] 백준 #1157 문제 풀이

재오·2022년 9월 23일
1

코딩테스트

목록 보기
4/46
post-thumbnail

이 문제를 풀기 위해서는 먼저 string, 배열, 아스키코드, 그리고 char에 대한 개념을 알아야 한다.

이 문제를 보게 되면 먼저 드는 생각은 어떻게 문자열을 입력 받고 그 문자를 어떻게 처리할까 이다. 문자열을 받으면 그것의 출현 빈도 수를 카운트해야 하기 때문에 배열을 우선 만들어야겠다는 생각이 들었다. 그리고 문자 배열의 char을 아스키코드를 이용해 분리를 해서 다른 배열 순서대로 for문을 이용하여 카운트를 증가시키는 것이 하나의 방법이다.

두번째 의문은 대문자와 소문자의 구분이 없어야 한다는 점이다. 그렇다면 이 역시 아스키코드를 이용해 대문자와 소문자는 똑같은 문자로 처리해 배열에 넣어줘야할 것이다.

마지막 의문은 만약 문자의 개수가 같을 경우 "?"를 출력해야 하는데 문자열 빈도 수가 똑같은 문자를 어떻게 처리할까 이다. 이는 또 다른 배열을 이용하여 최대 빈도수가 같은 수가 등장하게 된다면 카운트를 하나씩 증가시켜 하나씩 증가된 배열이 발견되면 "?"를 출력하도록 만들면 된다.

초안을 메모장에 끄적인 것은 다음과 같다.

최종 코드 및 주석

#include <iostream>

using namespace std;

int main() {
    
    int alpha[26] = {0};
    int cnt = 0; // 가장 많이 사용된 알파벳을 찾기 위한 변수 설정
    
    string input;
    //아스키코드 : 대문자 65~90, 소문자 97~122
    
    cin >> input;

    //빈도수 체킹
    for(int i=0;i<input.length();i++) {
        if(input[i]<97) alpha[input[i] - 65]++; //대문자
        else alpha[input[i] - 97]++; //소문자
    }

    int max = 0, max_indx=0;

    for(int i=0;i<26;i++) {
        if(max<alpha[i]) {
            max=alpha[i];
            max_indx = i;
        }
    }
    //가장 많이 사용된 알파벳이 여러개인가?
    for(int i=0;i<26;i++) {
        if(max==alpha[i]) cnt++;
    }
    //여러개라면 ? 출력, 아니라면 대문자로 출력
    if(cnt>1) cout << "?";
    else cout << (char)(max_indx+65) << endl;
}
profile
블로그 이전했습니다

0개의 댓글