BOJ|1157号



Pythonプール

from collections import Counter

s = input().upper() #단어를 입력받고 대문자로 바꿔서 s에 저장해 준다.
if len(s) == 1: print(s) #단어의 길이가 1이면 최빈 문자가 1개 뿐이므로 그냥 그 단어 출력
elif Counter(s).most_common(2)[0][1] == Counter(s).most_common(2)[1][1]:
    print('?')
else:
    print(Counter(s).most_common(1)[0][0])
この問題はdictionaryまたはlistがその値を格納する頻度で解くだけでよい.
しかし、「リストや文字列の中で最も頻繁な値を見つける関数はありますか?」好奇心から、私はグーグルゲームをしたことがありますが、やはりあります!コメントサイト(クリック) collectionsという名前のモジュールでは、Counterという名前の関数によって最も頻繁な値を見つけることができます.Counter(s)をします.以下のようにします.
>>> from collections import Counter
>>> a = 'abbcccddddeeeee'
>>> Counter(a)
Counter({'e': 5, 'd': 4, 'c': 3, 'b': 2, 'a': 1})
>>> type(Counter(a))
<class 'collections.Counter'>
最も頻繁な値の周波数を基準に、降順に並べられた辞書形式で出力されます.クラス名はcollections.Counter...
その後、most_common()関数は、()内の数に応じて、最も頻繁な値とその値の周波数をtuple形式に作成し、リストに組み合わせて返します.
>>> mode = Counter(a)
>>> mode.most_common(2)
[('e', 5), ('d', 4)]
>>> mode.most_common(4)
[('e', 5), ('d', 4), ('c', 3), ('b', 2)]
>>> 
簡単に2位を見せてあげましょう!4位まで展示しましょう!まあそうです.
最も空の値に近づきたい場合は、mode.most_common(1)[0][0]を入力します.
問題に戻ると
  • 単語の長さが1の場合、最大値は絶対に2つを超えてはいけません.印刷さえすればいいです.
  • 長さが1でない場合
  • の最空き値が2つを超えた場合:「?」出力
  • ピークが1つしかない場合:出力
  • C++プール

    #include <string>
    #include <iostream>
    
    using namespace std;
    
    int main()
    {
    	ios_base::sync_with_stdio(false);
    	cin.tie(NULL);
    
    	string S;
    	cin >> S;
    	for (int i = 0; i < S.size(); i++) {
    		S[i] = toupper(S[i]); //단어를 전부 대문자로 변환
    	}
    	int alpha[26] = { 0, }; //크기가 26인 배열 생성
    	for (char a : S) {
        		//단어 S의 각 문자를 돌며 그 문자의 번호를 인덱스로 해서 빈도수를 1씩 늘려준다.
                	//A = 0, B = 1, ..., Z = 25
    		alpha[a - 65]++;
    	}
        	//최빈값 찾기
    	int max = -1;
    	int cnt = 0;
    	for (auto i : alpha) {
    		if (max < i) max = i;
    	}
        	//최빈값 개수 찾기
    	for (int i = 0; i < 26;i++) {
    		if (alpha[i] == max) cnt++;
    		if (cnt >= 2) {
    			cout << "?";
    			return 0; //최빈값 개수가 2개 이상이면 main함수 끝냄 (더이상 실행 안함)
    		}
    	}
    	for (int i = 0; i < 26; i++) {
    		if (alpha[i] == max) cout << (char)(i + 65); //최빈값 출력
    	}
    }