본문 바로가기

Algorithm/BOJ

[백준/1157/c++] 단어 공부

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

 

1157번: 단어 공부

알파벳 대소문자로 된 단어가 주어지면, 이 단어에서 가장 많이 사용된 알파벳이 무엇인지 알아내는 프로그램을 작성하시오. 단, 대문자와 소문자를 구분하지 않는다.

www.acmicpc.net

 

 

문제 보자마자 쌩 하드코딩으로 광기를 뿜뿜했다

 

<문제의 광기 코드>

#include <iostream>
#include <string>

using namespace std;

int main(){
  string input;
  cin >> input;

  int alphabets[26] = {0};
  int pass = 0;

  
  for(int i=0; i<input.size(); i++){
    if(input[i] == 'A' || input[i] == 'a') alphabets[0]++;
    else if(input[i] == 'B' || input[i] == 'b') alphabets[1]++;
    else if(input[i] == 'C' || input[i] == 'c') alphabets[2]++;
    else if(input[i] == 'D' || input[i] == 'd') alphabets[3]++;
    else if(input[i] == 'E' || input[i] == 'e') alphabets[4]++;
    else if(input[i] == 'F' || input[i] == 'f') alphabets[5]++;
    else if(input[i] == 'G' || input[i] == 'g') alphabets[6]++;
    else if(input[i] == 'H' || input[i] == 'h') alphabets[7]++;
    else if(input[i] == 'I' || input[i] == 'i') alphabets[8]++;
    else if(input[i] == 'J' || input[i] == 'j') alphabets[9]++;
    else if(input[i] == 'K' || input[i] == 'k') alphabets[10]++;
    else if(input[i] == 'L' || input[i] == 'l') alphabets[11]++;
    else if(input[i] == 'M' || input[i] == 'm') alphabets[12]++;
    else if(input[i] == 'N' || input[i] == 'n') alphabets[13]++;
    else if(input[i] == 'O' || input[i] == 'o') alphabets[14]++;
    else if(input[i] == 'P' || input[i] == 'p') alphabets[15]++;
    else if(input[i] == 'Q' || input[i] == 'q') alphabets[16]++;
    else if(input[i] == 'R' || input[i] == 'r') alphabets[17]++;
    else if(input[i] == 'S' || input[i] == 's') alphabets[18]++;
    else if(input[i] == 'T' || input[i] == 't') alphabets[19]++;
    else if(input[i] == 'U' || input[i] == 'u') alphabets[20]++;
    else if(input[i] == 'V' || input[i] == 'v') alphabets[21]++;
    else if(input[i] == 'W' || input[i] == 'w') alphabets[22]++;
    else if(input[i] == 'X' || input[i] == 'x') alphabets[23]++;
    else if(input[i] == 'Y' || input[i] == 'y') alphabets[24]++;
    else if(input[i] == 'Z' || input[i] == 'z') alphabets[25]++;
  }

  // 최대 구하기
  int max_idx = 0;
  for(int i=1; i<26; i++){
    if(alphabets[i] > alphabets[max_idx]){
      max_idx = i;
    }
  }

  for(int i=0; i<26; i++){
    if((i != max_idx) && (alphabets[i] == alphabets[max_idx])){
      cout << "?";
      pass = -1;
      break;
    }
  }

  if(pass == 0){
    cout << char(max_idx + 65);
  }
  
}

 

아니 근데 왠걸?

돌리자마자 바로 '틀렸습니다' 뜨길래

구글링 해서 맞은 코드를 봤는데

내 코드랑 로직은 똑같은데 거기는 알파벳 카운팅할 때 알파벳이 맞는지를 확인하는게 아니라(광기의 if else 26문장)

아스키코드로 대문자, 소문자 구분하고 빼기 해줘서 바로 미리 만들어놓은 알파벳 배열의 인덱스로 접근해서 증가 시켜줬다.

 

=> 여기서 궁금한점!

그럼 틀린 이유가 시간복잡도 때문인가? 뭐지??

저렇게 고치면 얼만큼 시간이 단축되는건지?

 

=> 둘의 시간복잡도는 같다고 함.

 

=> 틀린 이유는 저건 아니었고,,, max_idx 찾는 부분에서 틀린게 있었다 하하

 

 

'Algorithm > BOJ' 카테고리의 다른 글

2903 - 중앙이동알고리즘  (0) 2025.01.30
[백준/10988/c++] 팰린드롬인지 확인하기  (0) 2024.02.17
[백준/11718/c++] 그대로 출력하기  (0) 2024.02.13
[백준/2908/c++] 상수  (0) 2024.02.13
[백준/10809/c++] 알파벳 찾기  (0) 2024.02.13