1. 문제 상세
https://www.acmicpc.net/problem/1157
2. 문제 접근
문자열을 받아서 해당 문자열 내에 알파벳이 각각 몇 개 인지 확인하고(알파벳의 대문자와 소문자 구분 없이 개수 체크, Aaabb 와 같은 경우 A 가 3개로 제일 많다.) 가장 많은 알파벳을 대문자로 출력, 가장 많은 개수의 알파벳이 여러개라면 ? 를 출력하자.
이를 위해 크기가 26인 정수 배열을 하나 만들고, 인덱스를 알파벳과 매치해보자. (0 = a/A, 1 = b/B, 2 = c/C, ... 25 = z/Z)
반복문을 사용하여 문자열의 크기만큼 반복하도록 한다.
이제 반복에서 문자열 맨 앞부터 문자를 가져와 아스키 코드를 인덱스와 매치하여 활용하자.
아스키 코드에서 알파벳 대문자는 A 부터 순서대로 65~90 이고, 소문자는 a 부터 순서대로 97~122 까지이다.
따라서 문자열에서 문자를 가져와 해당 문자의 아스키 코드 값이 97 미만이면 65('A')를, 97 이상이라면 97('a')을 빼주면
정수 배열에서의 매치와 같이 a/A = 0, b/B = 1, c/C = 2, ... z/Z = 25 와 같은 값이 나오게 된다.
이렇게 아스키코드의 값에서 65 혹은 97을 뺀 값을 정수 배열의 인덱스로 사용하여 정수 배열에 접근,
해당 인덱스의 값을 카운트하기 위해 1씩 더해주자.
문자열의 알파벳을 모두 확인했다면 이제 어떤 알파벳이 가장 많은지 확인하자.
이를 위해 먼저 char 변수와 정수형 변수를 하나씩 생성하고 0으로 초기화한다.(c 와 max 라고 하자),
반복문으로 위의 정수 배열을 돌며 배열의 값이 max 와 같다면 c 에 '?' 를 저장한다. (같은 값을 찾고나서 더이상 큰 값이 없으면 가장 많은 개수의 알파벳이 여러개인 것이므로 ? 를 출력하도록 한다)
위의 경우가 아닐 때 값이 max 보다 크다면 max 에 해당 배열의 값을 저장하고, c 에 해당 인덱스에 65를 더한 값을 저장한다.
인덱스 값에 65를 더하면 그 인덱스와 매치하는 알파벳 대문자 아스키코드값이 char 형식 변수에 저장되어 출력 시 해당 알파벳 대문자가 출력된다.
반복이 끝나면 c 를 출력한다.
3. 문제 풀이
#include <iostream>
using namespace std;
int main() {
int a[26] = { 0, }, max = 0;
char c;
string s;
cin >> s;
for(int i = 0; i < s.length(); i++) {
if(s[i] < 97) a[s[i] - 65]++;
else a[s[i] - 97]++;
}
for(int i = 0; i < 26; i++) {
if(max == a[i]) c = '?';
else if(max < a[i]) {
max = a[i];
c = i + 65;
}
}
cout << c;
}
크기가 26인 정수형 배열 a 를 선언하고 값을 모두 0으로 초기화, 정수형 변수 max 를 선언하고 값을 0으로 초기화한다.
char형 변수 c 를 선언, 문자열 객체 s 를 생성한다.
cin 으로 문자열을 입력받아 s 에 저장한다.
for문으로 i 가 0부터 문자열 s 의 크기보다 작을 때, 1씩 더하며 반복하도록 한다.
반복에서는 if문으로 문자열 s 의 i 번 인덱스의 값이 97보다 작다면, 즉 문자가 알파벳 대문자인 경우, 문자열 s 의 i 번 인덱스의 에서 65를 뺀 값을 인덱스로 배열 a 에 참조하여 해당 값에 1을 더해준다.
위의 경우가 아닌 경우, 즉 알파벳 소문자인 경우, 65가 아닌 97을 뺀 값을 인덱스로 참조하여 해당 값에 1을 더해준다.
위의 반복이 끝나면 다시 for문으로 i 가 0 부터 26보다 작을 때 1씩 더하며 반복하도록 한다.
반복에서는 if문으로 max 의 값이 배열 a 의 i 번 인덱스의 값과 같다면 c 에 '?' 문자를 저장한다.
위의 경우가 아니고 max 의 값보다 배열 a 의 i 번 인덱스의 값이 크다면 max 에 a 의 i 번 인덱스의 값을 저장하고, c 에는 i 에 65를 더한 값을 저장한다.
위의 반복이 끝나면 cout 으로 c 를 출력한다.
4. 성능 확인
5. 마무리
.
'백준 - 단계별로 풀어보기 > 심화 1' 카테고리의 다른 글
[백준] 1316번 : 그룹 단어 체커| C++ (0) | 2023.10.12 |
---|---|
[백준] 2941번 : 크로아티아 알파벳 | C++ (0) | 2023.10.11 |
[백준] 10988번 : 팰린드롬인지 확인하기 | C++ (0) | 2023.10.11 |
[백준] 2444번 : 별 찍기 - 7 | C++ (0) | 2023.09.26 |
[백준] 3003번 : 킹, 퀸, 룩, 비숍, 나이트, 폰 | C++ (0) | 2023.09.26 |