반응형
https://www.acmicpc.net/problem/1157
[ 코드 ]
#include<iostream>
using namespace std;
int main(){
string s;
int arr[26] = {0, }; //배열을 초기화 할 경우 이런 식으로 표기.
int max = 0;
int index = 0;
cin >> s;
for(int i=0; i<s.length(); i++){
if(s[i]<97){
arr[s[i]-65]++; //대문자
}else{
arr[s[i]-97]++; //소문자
}
}
for(int i=0; i<26; i++){
if(max < arr[i]){
max = arr[i];
index = i;
}
}
for(int i=0; i<26; i++){
if(i == index){
continue;
}else if(max == arr[i]){ //if문으로 따로 빼서 표기 가능.
cout << "?" << endl;
return 0;
}
}
cout << (char)(index+65);
return 0;
}
이 문제를 풀기 위해서는 대소문자를 하나로 통일해주고 카운트를 하는 방법으로 문제를 풀어나가야한다.
이를 위해
소문자 <-> 대문자 변환이 필요.
1. 단순하게 아스키코드표 상의 숫자 차이를 줄이기.
대문자 'A' = 65;
소문자 'a' = 97;
이기 때문에 32 차이를 이용해 풀 수 있다.
2. tolower, toupper 함수 이용하기.
이 문제를 풀면서 새로 알게 된 함수이다.
tolower : 대문자 -> 소문자
toupper : 소문자 -> 대문자
로 변환하는것이다.
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]);
} //대->소
이런 식으로 쓸 수 있다.
초보자를 위해
예를 들어,
#include <iostream>
using namespace std;
int main(){
string str = "Hello World";
for (int i=0; i<str.size(); i++){
str[i] = toupper(str[i]);
}
cout<<str<<endl;
}
출력 : HELLO WORLD
이런 식으로 가능한 것이다.
[ 다른 사람의 코드 ]
#include <iostream>
using namespace std;
int main(void) {
int max = 0, idx = 0, arr[26] = {0,};
string S;
const string a = "ABCDEFGHIJKLMNOPQRSTUVWXYZ?";
cin>>S;
for(int i = 0; i < S.length(); i++){
S[i] = toupper(S[i]);
arr[a.find(S[i])]++;
}
for(int j = 0; j < sizeof(arr)/sizeof(int); j++){
if(arr[j] == 0)
continue;
if(max == arr[j]){
idx = 26;
continue;
}
if(max < arr[j]){
max = arr[j];
idx = j;
}
}
cout<<a[idx];
}
여기서
find() 함수도 새로 사용되었다.
※find 함수란?
어떤 문자열에서 특정 문자(열)을 찾아 그 위치를 반환한다.
string s = "abcde";
cout << s.find("d") << endl;
cout << s.find("bcd") << endl;
일 경우,
3
1
을 반환한다.
더 자세한 내용은 이 블로그를 참고하면 좋다.
* 오늘의 포인트
tolower, toupper 함수와 find 함수를 사용하여 풀어보는 것.
다른 프로그래머스 문제를 풀면서도
const string a = "ABCDEFGHIJKLMNOPQRSTUVWXYZ?";
와 같이 문자열을 미리 만들어 둔 뒤, substr을 하던가 find를 하며 문제를 푼 기억이 있는데 다시 한번 상기 시키는 계기가 되었다.
반응형
'Algorithm > 백준' 카테고리의 다른 글
[백준] 1874번 : 스택 수열 / c++ (0) | 2020.05.22 |
---|---|
[백준] 10828번 : 스택 / c++ (0) | 2020.05.22 |
[백준] 11060번 : 점프 점프 / c++ (0) | 2020.05.21 |
[백준] 1037번 : 약수 / c++ (0) | 2020.05.19 |
[백준] 11654번 : 아스키코드 / c++ (0) | 2020.05.18 |