풀이1 (내풀이)
- 입력 단어의 길이가 1,000,000 이하 이므로, int alphabet[26]으로 설정해야한다. char alphabet[26]으로 설정하면 각 문자당 127개까지만 셀 수 있다.
- 'A'가 65, 각 소문자는 대문자에 +32 한 것을 활용해서 대문자 기준으로 각 알파엣의 index를 설정하였다.
- 처음에 aabc 반례를 못 찾아서 계속 '틀립니다'가 떴다. 이를 위해 break;를 없앴다.
#include <iostream>
#include <string>
#include <climits>
using namespace std;
/*
* alphabet[26] 배열은 소문자, 대문자 구분안한 알파벳 각각의 개수
* A = 65 (아스키코드)를 이용, a = A + 32 임을 이용
* 문자열 각각의 문자 하나씩 보면서 alphabet 의 값을 증가시킴
*
* alphabet에서 가장 큰 값 중복 없이 찾은 경우,
* 큰 값의 인덱스 값 + 65 한 char 문자를 출력
* alphabet에서 가장 큰 값에서 중복이 있었다면,
* ? 출력
*/
int main() {
int alphabet[26] = { 0, };
string s;
int max = INT_MIN;
int check = 0;//?만 출력하기 위한 flag
int maxIndex = -1;
cin >> s;
for (int i = 0; i < s.length(); i++)
{
int k = s[i] - 'A'; //문자를 아스키코드 표를 참고해 10진수로 바꿈
if (k >= 32) //문자가 소문자인 경우, 대문자와 같은 취급하도록 32를 더 빼줌
k -= 32;
if (k>=0 && k<26)
alphabet[k] += 1; //문자의 개수를 증가시켜 개수 세기
}
for (int i = 0; i < 26; i++)
{
if (max < alphabet[i]) {
max = alphabet[i];
maxIndex = i;
check = 0;
}
else if (max == alphabet[i])
{
check = 1;
}
}
char a = (check == 0) ? char(maxIndex + 65) : '?';
cout << a;
return 0;
}
풀이2 (다른사람)
- 시간을 줄이기 위해 코드를 추가한 부분이 있다.
- 대문자와 소문자 각각에 대해 조건문으로 작성하였다.
#include <bits/stdc++.h>
using namespace std;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
string c;
int a[26] = { 0 };
int max = 0;
cin >> c;
for (int i = 0; i < c.length(); i++) {
if (c[i] > 64 && c[i] < 91) a[c[i] - 'A'] += 1;
if (c[i] > 96 && c[i] < 123) a[c[i] - 'a'] += 1;
}
for (int i = 1; i < 26; i++) {
if (a[i] != 0 && a[i] == a[max]) {
cout << "?";
return 0;
}
if (a[i] != 0 && a[i] > a[max]) max = i;
}
cout << char(max + 'A');
}
'전공 > 알고리즘(algorithm)' 카테고리의 다른 글
[C++] 백준(BOJ) 1316 그룹 단어 체커 (1) | 2024.01.04 |
---|---|
[C++] 백준(BOJ) 2941 크로아티아 알파벳 (2) | 2024.01.04 |
[C++] 백준(BOJ) cin.tie(NULL) / ios_base::sync_with_stdio(false) / endl 대신 \n (1) | 2024.01.02 |
[C++] 백준(BOJ) 10988 팰린드롬인지 확인하기 (1) | 2024.01.02 |
[C++] 문자열 string vs char array 차이 비교 (0) | 2024.01.02 |