가장 많이 사용된 알파벳 알아내기
코드
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | #include <iostream> #include <string> using namespace std; int main() { string word; cin>>word; int listOfWord[26]={0,}; int maxIdx=0, max; for(int i=0; i<word.size(); i++) { max=listOfWord[maxIdx]; if(word[i]>90) {//아스키코드에서 대문자가 아니면 word[i]=toupper(word[i]); } int NumberOfWord=word[i]-65; //아스키코드 사용 listOfWord[NumberOfWord]+=1; if(listOfWord[NumberOfWord]>max) { maxIdx=NumberOfWord; } } for(int i=0; i<26; i++) { if(maxIdx!=i&&listOfWord[maxIdx]==listOfWord[i]) { cout<<"?"<<"\n"; return 0; } } cout<<(char)(maxIdx+65)<<"\n"; return 0; } | cs |
처음에는 selectionSort 함수를 따로 만들어서 정렬한 다음 listOfWord[25]를 출력하려고 했으나...
이 쉬운 문제에서 그나마 신경 쓸 부분이 눈에 띄었다.
개수가 같은 것 골라내기인데, 지금까지 최솟값 최댓값 최빈값 등등 다 구해봤지만 이건 처음이었던 것 같다.
listOfWord는 알파벳들의 빈도수를 담는 리스트이다.
알파벳은 총 26개이고, 대문자와 소문자를 구별하지 않으니 길이는 26으로 해도 된다.
최댓값 max는 알파벳 빈도수의 최대값인데, 포문이 돌 때마다 매번 갱신해줘야 한다.
이렇게 하면 따로 또 포문을 써서 max를 구해주지 않아도 된다.
마지막으로 두 번 나왔을 때를 걸러주는데, 만약 하나라도 같으면 ?을 출력하고 실행을 끝낸다.
아니면 포문을 빠져나와 maxIdx+65에 해당하는 알파벳 출력.
대문자, 소문자로 변환해주는 toupper, tolower
사실 위처럼 했더니 CLion에서는 경고를 주더라. 무시하고 넣었어도 맞긴 했지만...
아무튼 오늘 알게 된 함수는 대문자, 소문자로 변환해주는 것이다.
toupper(char) => 대문자로 변환
tolower(char) => 소문자로 변환
1 2 3 4 5 6 7 8 9 10 | 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]); } //전부 대문자로 변환 | cs |
이런 식으로 쓰면 된다.
두 함수는 그저 한 문자에 대해서만 변환을 해주는 것이기 때문에 전체를 변환하려면 포문을 써야한다.
1 2 3 4 | string str="hello WORLD"; str=toupper(str); cout<<str; | cs |
실제로 이렇게 넣고 돌려보니 안 뜬다.
이유는 두 함수가 int를 매개변수로 갖기 때문이다.
그 외에도 아스키 코드에서 A는 65부터, a는 97부터 시작한다는 것.
쉬운 문제라도 틈틈히 풀어야 겠다...
오늘 using namespace std 안 써서 오류났다 큐ㅠㅠㅠㅠ
아무도 안 보지만 조금 창피한 건 사실이다
'PS' 카테고리의 다른 글
백준 10253번 C++ 헨리 (0) | 2019.05.20 |
---|---|
백준 1107번 C++ 리모컨 문제 (추가) (0) | 2019.05.18 |
백준 1181번 C++ 단어 정렬하기 (0) | 2019.04.11 |
백준 2581번 C++ 소수 판별하기 (0) | 2019.02.20 |
백준 1026번 C++ 보물 (0) | 2019.02.14 |
댓글