baekjoon 1157

윤동환·2022년 12월 2일
0

Algorithm

목록 보기
11/54
post-thumbnail

단어공부

주어진 문자열에서 가장 많이 사용된 문자를 출력하라 가장 많이 사용된 문자가 2개 이상이라면 ? 를 출력하라

내가 작성한 코드

#include <iostream>
#include <string>
#include <algorithm>

using namespace std;

int howMany(string s, char c) {
    int count = 0;
    for (char a : s) {
        if (c == a)
            ++count;
    }
    return count;
}

int main() {
    string k;
    cin >> k;
    transform(k.begin(), k.end(), k.begin(), ::toupper);
    int ret = 0;
    int max = 0;
    char maxc = '\0';
    int check = 0;
    
    for (char i = 'A'; i <= 'Z'; ++i) {
        ret = howMany(k, i);
        if (max <= ret) {
            if (max == ret) {
                check = 1;
            } else {
                check = 0;
            }
            max = ret;
            maxc = i;
        }
    }
    if (check == 1) {
        cout << '?' << endl;
    } else {
        cout << maxc << endl;
    }
    return 0;
}

고민했던 부분

  1. 배열 26칸을 만들어 각 배열마다 문자의 개수를 저장하여 비교하려고 하였으나, 문자열에서 개수를 찾고, 배열내의 가장 높은 숫자를 갖는 인덱스를 찾는것이 비 효율적이라 판단되었다.
  2. 받은 문자열을 sort하여 가장 많이 갖고 있는 문자를 순차적으로 찾으려고 하였으나 sort 자체가 무의미 하다고 생각되었다.
  3. 대소문자를 구별하지 않는다고 하여서 출력 포맷인 대문자로 받은 문자열을 바꾸어주어 문자를 찾을 때 수월하게 해주었다.
  4. for문을 'A' 부터 'Z'까지 한번 돌아 가장 큰 값을 갖는 문자와 그 개수를 기록하며 가장 큰값을 갖는것이 2개 이상일 경우 check변수를 통하여 기록해두었다.

주의 사항

for (auto a : s)
위 문법은 c11 이상에서 사용할 수 있는 문법입니다.

transform()
위 함수는 algorithm 헤더를 추가하여 사용해야 합니다.
이상한 점은, vscode에서 algorithm헤더를 추가하지 않고도 컴파일 및 실행이 되었는데 백준에선 컴파일 에러를 발생시켰습니다.

profile
모르면 공부하고 알게되면 공유하는 개발자

0개의 댓글