알고리즘/백준

[백준/c++] 9046번: 복호화

녕이 2022. 7. 17. 16:50
728x90

 

https://www.acmicpc.net/problem/9046

 

9046번: 복호화

입력의 T(1 ≤ T ≤ 20)는 테스트 케이스로, 입력 제일 상단에 주어진다. 각각의 테스트 케이스는 한 줄마다 소문자와 공백으로 이루어진 영어 문장이 주어진다. 이 문장의 길이는 적어도 1이상이

www.acmicpc.net

 

 

처음에 이 문제를 풀 땐, 암호문을 평문으로 바꾸고 암호문에 가장 많이 사용된 평문 알파벳을 찾는 것인 줄 알았다.

문제에서 보여준 예시도 hello there -> e 였기 때문에

그런데 풀다 보니 그냥 암호문에서 가장 많이 사용된 알파벳을 찾는 것이었다... 따흑... 시간만 날려먹은..

 

STL을 사용하려다가 그냥 배열을 선택했다. 배열 0~25는 'a'~'z'로 사용할 수 있으므로... ('a'를 빼주면 해당 알파벳의 배열 인덱스가 나온다) 그리고 카운팅이 가장 많이 된 알파벳을 찾고, 만약 카운팅 개수가 같은 알파벳이 있으면?를 출력해준다.

 

#include <iostream>
#include <string>
#include <algorithm>
using namespace std;

int main(){
    ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    int cnt[26] = {0, };
    int t;
    cin >> t;
    cin.ignore();
    while(t--){
        string s;
        getline(cin, s);
        
        for(int i=0; i<s.size(); i++){
            if(s[i] == ' ') continue;
            int n = s[i]-'a';
            cnt[n]++;
        }
        int maxN = cnt[0];
        char ans = 'a' + 0;
        for(int i=1; i<26; i++){
            if(maxN < cnt[i]){
                maxN = cnt[i];
                ans = 'a' + i;
            }
        }
        sort(cnt, cnt+26, greater());
        if(cnt[0] == cnt[1]) cout << "?\n";
        else                 cout << ans << '\n';
        
        for(int i=0; i<26; i++) cnt[i] = 0;
    }
    
    return 0;
}

 

 

 

 

 

728x90