[editorial] 2008년 ACM ICPC 서울대회 인터넷 예선 A번 Decryption

  • astein
    astein

     * Problem Statement
      문제는 길지만, 간단하게 요약하면 주어진 스트링에서 제일 많이 나오는 문자를 찾아서 출력하는 문제입니다. 만약 여러 개 존재한다면 '?'를 출력합니다.

    • Analysis   인터넷 예선 문제에 String Input과 관련된 문제가 있었던 이유는 아마도 이 문제를 위함이 아니었을까 싶습니다. scanf를 사용한다면 공백이 있는 스트링을 입력받기 위해서는 귀찮은 처리를 해야 하기 때문이지요. 이러한 스타일의 입력이 주어지는 경우에는 fgets나 gets를 사용해서 입력받는 것을 권장합니다. (iostream의 getline을 써도 되지요.)   사실 입력을 정상적으로 받았다면 인터넷예성 A번의 명성[?]에 걸맞게 누구라도 풀 수 있는 문제였습니다.
    • source code
    #include <cstdio>
    #include <string>
    #include <algorithm>
    #include <sstream>
    #include <vector>
    using namespace std;
    inline string GetLine()
    {
     char str[1005];
     fgets(str, 1000, stdin);
     return str;
    }
    int main()
    {
     string strT = GetLine();
     int T;
     istringstream sin(strT); sin >> T; // 첫 줄은 Number of Dataset
     while (T--)
     {
      string strInput = GetLine();
      vector <int> nAlphabet(26, 0);
      for (int i = 0; i < strInput.size(); ++i)
      {
       char ch = strInput[i];
       if (ch != ' ') nAlphabet[ch - 'a']++;
      }
     
      // 제일 많은 알파벳이 몇 개인지 리스트에서 검색
      int maxAlphabet = *(max_element(nAlphabet.begin(), nAlphabet.end()));  
      char cRet = '?';
      // maxAlphabet의 개수를 가지는 알파벳이 1개 있다면
      if (count(nAlphabet.begin() , nAlphabet.end(), maxAlphabet) == 1)    
      {
       // 그 알파벳의 index를 가져와서 알파벳으로 변환합니다.
       cRet = 'a' + (find(nAlphabet.begin(), nAlphabet.end(), maxAlphabet) - nAlphabet.begin());
      }
      printf("%c\n", cRet);
     }
    }
    
    [이 글은 과거 홈페이지에서 이전된 글입니다. 원문보기]

    15년 전
0개의 댓글이 있습니다.
  • 정회원 권한이 있어야 커멘트를 다실 수 있습니다. 정회원이 되시려면 온라인 저지에서 5문제 이상을 푸시고, 가입 후 7일 이상이 지나셔야 합니다. 현재 문제를 푸셨습니다.