백준 1157_단어 공부.cpp

hello_hidi·2021년 6월 28일
0

baekjoon_C++

목록 보기
2/33
post-thumbnail

소스코드

#include <iostream>
#include <cstring>
using namespace std;
char alpabet[27] = {'A','B','C','D','E','F','G','H','I',
                    'J','K','L','M','N','O','P','Q','R',
                    'S','T','U','V','W','X','Y','Z','?'};
int main(){
    int result[26] = {0,};
    int check = 0;
    string s;
    cin >> s;
    for(int i = 0; i < s.length(); i++){
        s[i] = toupper(s[i]);
        for(int j = 0; j < 26; j++){
            if(s[i] == alpabet[j]){
                result[j]++;
            }
        }
    }
    int max = result[0]; //최빈값
    int maxidx = 0; //많이 나온 알파벳의 인덱스
    for(int i = 1; i < 26; i++){
        if(max == result[i]){
            maxidx = 26;
            continue;
        }
        if(result[i] > max){
            max = result[i];
            maxidx = i;
        }

    }
    
    cout << alpabet[maxidx] << endl;
    return 0;
}
  1. 변수
    char alpabet[27] : 알파벳과 ?을 저장해둔 배열
    int result[26] : 최빈값을 조사하기 위한 배열
    string s : 입력받은 문자열
    int max : 최빈값 int maxidx : 가장 많이 나온 알파벳의 인덱스
  1. 알고리즘
    1. 문자열을 입력받아 모든 알파벳을 대문자로 바꿨다.(대소문자의 구분 없애기 위해)
    2. 문자열의 각 문자를 알파벳 배열과 비교하여 해당하는 알파벳의 인덱스의 result배열의 값을 더해준다.
    3. (보완 전 단계 알고리즘)
      1) max값에 result[0](a의 빈도수)를 기준으로, maxidx는 0을 기준으로
      for문을 돌면서 가장 많이 나온 값을 찾아준다
      2) max, maxidx값이 결정되면 max값과 중복되는 값이 있는지 찾기 위해서
      for문을 다시 돌려서 만약 check값(result[i] == max)이 2개 이상이면 ?를 출력하고 리턴한다.
    4. (보완 후 알고리즘)
      일단은 for문을 두번 연속 쓰는것, check라는 변수를 한개 더 만드는 것을 줄일 수 있는 방법을 찾고 싶었다.
      1) ?를 alpabet배열에 저장해둔다.
      2) 만약 max==result[i]라면 max값을 ?로 만들어주고 continue
      3) 그 다음에 max를 비교하는 코드를 둔다.
      4) 이렇게 하면 만약 문자열 내에 많이 나온 알파벳 값이 2개 이상이더라도 미리 ?로 값이 정해져 있기 때문에 걸러지게 된다.
    5. 마지막으로 alpabet[maxidx]를 출력해준다.
```
int max = result[0]; //최빈값
int maxidx = 0; //많이 나온 알파벳의 인덱스
for(int i = 1; i < 26; i++){
    if(result[i] > max){
        max = result[i];
        maxidx = i;
    }
}
for(int j = 0; j < 26; j++){
    if(result[j] == max){
        check++;
        if(check >= 2){
            cout << '?' << endl;
            return 0;
        }
    }
}
```
  1. 배운점
    1) 대문자 : toupper(char) / 소문자 : tolower(char) =>
    2) continue : 코드 실행 건너뛰기
  1. 아쉬운점&느낀점
    일차적으로는 먼저 내가 생각한대로 코드를 돌려 맞는게 우선이다. 쨌든 코딩테스트에선 그게 장땡이기 때문에, 하지만 연습하는 지금 과정에서는 다른 사람들의 방법을 많이 찾아보면서 배우는 것이 아주 중요하다. 간혹 더 많은 문제를 풀기 위해서, 어차피 맞았는데 굳이 다른 사람의 코드를 읽어봐야 되나라는 안일한 생각은 오로지 일차적인 방법만 쓰는 나에게 전혀 도움이 되지 않는다는 것을 다시 한번 상기시켜야겠다.
profile
안뇽희디

0개의 댓글