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]
を入力します.
問題に戻ると
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])
>>> 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'>
>>> mode = Counter(a)
>>> mode.most_common(2)
[('e', 5), ('d', 4)]
>>> mode.most_common(4)
[('e', 5), ('d', 4), ('c', 3), ('b', 2)]
>>>
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); //최빈값 출력
}
}
Reference
この問題について(BOJ|1157号), 我々は、より多くの情報をここで見つけました
https://velog.io/@hrpp1300/BOJ-1157번
テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol
#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); //최빈값 출력
}
}
Reference
この問題について(BOJ|1157号), 我々は、より多くの情報をここで見つけました https://velog.io/@hrpp1300/BOJ-1157번テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol