본문 바로가기
Algorithm/백준

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

by 코딩친구 2020. 5. 22.
반응형

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

 

1157번: 단어 공부

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

www.acmicpc.net

 

 

[ 코드 ]

 

#include<iostream>

using namespace std;

int main(){
  string s;
  int arr[26] = {0, }; //배열을 초기화 할 경우 이런 식으로 표기.
  int max = 0;
  int index = 0;

  cin >> s;

  for(int i=0; i<s.length(); i++){
    if(s[i]<97){
      arr[s[i]-65]++; //대문자
    }else{
      arr[s[i]-97]++; //소문자
    }
  }

  for(int i=0; i<26; i++){
    if(max < arr[i]){
      max = arr[i];
      index = i;
    }
  }

  for(int i=0; i<26; i++){
    if(i == index){
      continue;
    }else if(max == arr[i]){ //if문으로 따로 빼서 표기 가능.
      cout << "?" << endl;
      return 0;
    }
  }

  cout << (char)(index+65);
  return 0;

}

 

이 문제를 풀기 위해서는 대소문자를 하나로 통일해주고 카운트를 하는 방법으로 문제를 풀어나가야한다.

 

이를 위해

소문자 <-> 대문자 변환이 필요.

 

 

 

 

1. 단순하게 아스키코드표 상의 숫자 차이를 줄이기.

 

대문자 'A' = 65;
소문자 'a' = 97;

 

이기 때문에 32 차이를 이용해 풀 수 있다.

 

 

 

 

2. tolower, toupper 함수 이용하기.

 

이 문제를 풀면서 새로 알게 된 함수이다.

 

tolower : 대문자 -> 소문자

toupper : 소문자 -> 대문자

 

로 변환하는것이다.

 

string str;
cin >> str;
 
for(int i=0; i<str.size(); i++) {
    str[i] = toupper(str[i]);
} //소->대
 
for(int i=0; i<str.size(); i++) {
    str[i] = tolower(str[i]);
} //대->소

 

이런 식으로 쓸 수 있다.

 

 

 

초보자를 위해

예를 들어,

 

#include <iostream>

using namespace std;

int main(){
  string str = "Hello World";
  
  for (int i=0; i<str.size(); i++){
    str[i] = toupper(str[i]);
  }
  
  cout<<str<<endl;

}

 

출력 : HELLO WORLD

 

이런 식으로 가능한 것이다.

 

 

 

 

[ 다른 사람의 코드 ]

 

#include <iostream>
using namespace std;

int main(void) {
    int max = 0, idx = 0, arr[26] = {0,};
    string S;
    const string a = "ABCDEFGHIJKLMNOPQRSTUVWXYZ?";
    cin>>S;
    for(int i = 0; i < S.length(); i++){
        S[i] = toupper(S[i]);
        arr[a.find(S[i])]++;
    }
    for(int j = 0; j < sizeof(arr)/sizeof(int); j++){
        if(arr[j] == 0)
            continue;
        if(max == arr[j]){
            idx = 26;
            continue;
        }
        if(max < arr[j]){
            max = arr[j];
            idx = j;
        }
    }
    cout<<a[idx];
}

 

여기서

 

find() 함수도 새로 사용되었다.

 

※find 함수란?

어떤 문자열에서 특정 문자(열)을 찾아 그 위치를 반환한다. 

string s = "abcde";

cout << s.find("d") << endl;
cout << s.find("bcd") << endl; 

 

일 경우,

 

3

1

 

을 반환한다.

 

더 자세한 내용은 이 블로그를 참고하면 좋다.

https://chp747.tistory.com/62

 

 

* 오늘의 포인트

tolower, toupper 함수와 find 함수를 사용하여 풀어보는 것.

다른 프로그래머스 문제를 풀면서도

const string a = "ABCDEFGHIJKLMNOPQRSTUVWXYZ?";

와 같이 문자열을 미리 만들어 둔 뒤, substr을 하던가 find를 하며 문제를 푼 기억이 있는데 다시 한번 상기 시키는 계기가 되었다.

반응형