본문 바로가기
알고리즘/문제

[백준] 1157. 단어 공부 <C++>

by 코드 이야기 2020. 4. 15.
728x90

www.acmicpc.net/problem/1157

 

1157번: 단어 공부

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

www.acmicpc.net

 

 

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

int main() {
  string c;
  char ch;
  int arr[27]={0,}, max1=0, max2=0, idx1, idx2;
  
  cin>>c;
  for(int i=0; c[i]!='\0'; i++)    //1)
  {
    if(c[i]>=97)    //대문자, 소문자를 알파벳의 개수를 세주는 배열에 집어넣는다  2)
      arr[c[i]-97]++;
    
    else
      arr[c[i]-65]++;
  }

  for(int i=0; i<26; i++)  //3)
  {
    if(arr[i]>=max1)
    {
      max1=arr[i];
      idx1=i;
    }
  }

  for(int i=0; i<26; i++)  //4)
  {
    if(i==idx1)  //4-1)
      continue;

    if(arr[i]>=max2)
    {
      max2=arr[i];
      idx2=i;
    }
  }

  if(max1>max2)  //5)
    ch=idx1+65;
  
  else if(max1==max2)  //6)
    ch='?';

  cout<<ch;
}

 

1) 입력받은 문자의 길이만큼 반복

  - stelen을 사용하여도 좋지만, 가끔 헤더에 cstring을 선언하기 귀찮아서 저렇게 쓴다.

  - 문자 배열은 초기화를 하지 않는다면 '\0'이 초기값이기떄문에 저렇게 쓴 것이다.

 

2) 아스키 코드값

  - (https://namu.wiki/w/%EC%95%84%EC%8A%A4%ED%82%A4%20%EC%BD%94%EB%93%9C) <꺼무위키>

  - 알파벳의 개수(26)대로 선언한 배열에 0번 방은 a의 개수, 1번 방은 b의 개수... 세준다.

 

3) 가장 개수가 많은 알파벳을 하나 골라낸다. <하지만 하나만 구해서는 문제를 풀 수 없기에 4번으로 넘어간다>

 

4) 한 번 더 가장 많은 알파벳을 고르고 그 개수를 max1에 저장한다.

4-1) 중복되는 것을 막기 위해 3번에서 구한 가장 수가 많은 알파벳(max1)의 인덱스(idx1)를 제외한다.

 

5) 첫 번째로 개수를 구한 게 더 크다면 max1이 가장 많은 개수를 가지고 있으므로 그 문자를 아스키코드를 이용해 문자 배열에 담아준다.

 

6) 첫 번째로 구한 개수와, 두 번째로 구한 개수가 같다면 가장 큰 녀석은 존재하지 않으므로 ?를 문자 변수에 담아준다.

 

 

 

평가> 조금 더러운 것 같지만 단순 무식해서 좋은 것 같다

728x90

댓글