반응형
문제 요약
알파벳으로 이루어진 입력 문자열에서 가장 많이 사용된 알파벳 대문자로 출력
가장 많이 사용된 알파벳이 2개 이상이라면 물음표 ? 출력
풀이 과정
알파벳 대문자(A~Z)는 아스키코드 65부터 90까지이며
알파벳 소문자(a~z)는 아스키코드 97부터 122까지이다
위의 두가지를 사용해서 처음에는 알파벳 a부터 z까지 해당하는 배열을 만들려고했으나
돌면서 중복 값을 찾는게 귀찮아서 벡터로 전환해서 해결했다
인덱스와 값으로 알파벳에 접근가능한 배열
A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | W | R | S | T | U | V | W | X | Y | Z |
0 | 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 |
-1 | -1 | -1 | -1 | -1 | -1 | -1 | -1 | -1 | -1 | -1 | -1 | -1 | -1 | -1 | -1 | -1 | -1 | -1 | -1 | -1 | -1 | -1 | -1 | -1 | -1 |
아스키코드 65가 A이므로
index가 0인 경우, 65를 더한 다음 char 화하여 출력해주면 A가 출력이 되는 방법을 사용했다
초기값을 -1로 세팅해서 입력 문자열 str에 특정 알파벳이 나올 때마다
65나 97을 뺀 값을 벡터의 인덱스로 사용하여 증감연산자로 값을 1씩 올려준다
이때, 최대값을 저장하는 max와 최대값의 위치를 저장하는 index도 함께 업데이트를 해준다
문자열에서 반복되는 알파벳을 모두 체크한 다음 count를 사용하여 벡터에서 특정 max 값의 갯수를 센다
max의 값이 2개 이상이라면 물음표를 출력하고
그렇지 않는 경우에는 index에 65를 더하여 문자로 출력시켜주면 끝
코드
#include <bits/stdc++.h>
using namespace std;
int main() {
vector<int> v1(26,0);
string str;
cin >> str;
int tmp = 0;
int index = 0;
int max = -1;
for(int i=0; i<str.length(); i++){
//소문자
if(97 <= str[i] && str[i] <=122) {
v1[str[i] - 97]++;
if(max < v1[str[i] - 97]){
max = v1[str[i]-97];
index = str[i]-97;
}
}
//대문자
else if(65 <= str[i] && str[i] <= 90){
v1[str[i] - 65]++;
if(max < v1[str[i] - 65]){
max = v1[str[i]-65];
index = str[i]-65;
}
}
}
int cnt = count(v1.begin(), v1.end(), max);
if(2<=cnt) cout << "?";
else cout << char(index + 65);
return 0;
}
출처 : https://www.acmicpc.net/problem/1157
반응형
'문제풀기' 카테고리의 다른 글
[백준/BOJ] 심화 1316번 문제, 그룹 단어 체커 C++ 풀이 (0) | 2023.09.26 |
---|---|
[백준/BOJ] 문자열 2908번 문제, 상수 C++ 풀이 (0) | 2022.10.20 |
[백준/BOJ] 문자열 1152번 문제, 단어의 개수 C++ 풀이 (0) | 2022.10.19 |
[백준/BOJ] 문자열 2675번 문제, 문자열 반복 C++ 풀이 (1) | 2022.10.04 |
[ASCII] 아스키코드란, 참고하려고 기록해보는 아스키코드 표 (0) | 2021.12.27 |
[백준/BOJ] 출력 10171/10172번 문제, 개/고양이 C++ 풀이 (0) | 2021.12.13 |