[백준BOJ1157 C++] 단어 공부
문제
https://www.acmicpc.net/problem/1157
풀이
-
알파벳 대소문자로 이루어진 단어
아스키 코드로 이용해서 대문자, 소문자에 따라 특정 값을 구한다.
-
단어의 길이는 1,000,000을 넘지 않는다
char은 -128~+127 저장하기 때문에 string을 사용해야 된다.
-
가장 많이 사용된 알파벳을 대문자로 출력한다.
먼저 1번에서 아스키코드로 통해 알파벳 순서 값을 구한다. 이후 알파벳 배열(크기:26)에 해당하는 순서값의 인덱스에 +1 씩 더한 후, 가장 많이 사용된 알파벳을 대문자로 출력하기 위해서 max 값에 해당하는 인덱스를 아스키 코드로 이용해서 대문자로 출력하게 만든다.
-
가장 많이 사용된 알파벳이 여러 개 존재하면 ?를 출력한다.
갱신되고 있는 max값과 같은 값이 발견될 경우 ?를 출력하도록 작성한다.
제출
#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;
char r = '?';
cin >> c;
for (size_t 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 = 0; i < 26; i++) {
if (a[i] != 0) {
if (a[i] == max) r = '?';
else if (a[i] != 0 && a[i] > max) {
max = a[i];
r = char(i + 'A');
}
}
}
cout << r;
}
제출했던 오답코드
이전에는 max값을 가장 많이 사용된 알파벳 순서에 해당하는 인덱스에 할당했다. 예를 들면 Z가 많이 나오면, 0~25 중 25번째에 해당하기 때문에 max에 25를 넣는 방식이었다.
또한 출력값을 따로 char 변수에 할당하지 않고, 인덱스값을 받은 max+’A’를 즉석에서 char 타입으로 변환시키고 ?가 나오는 경우에는 바로 return 0;으로 끝내도록 했다.
#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');
}
그러나 이 방법으로 할 경우 반례로 ‘abcc’에서 C가 아닌 ? 가 나오게 된다. 왜냐하면 a, b 각각 인덱스 0, 1에서 값 1이 발견되기 때문에 순서대로 max 계산을 하면 a[max] = a[i]가 모두 1 로 값이 같기 때문에 더이상 계산하지 않고 자동으로 ‘?’가 나오게 된다. 따라서 return 0을 제거했다.
위와 같은 문제로 return 0을 제거하면 이젠 ‘?’가 출력된 후에 cout « char(max + ‘A’);가 또 출력되는 문제가 발생한다. 따라서 char 타입의 변수를 초기화한 상태로 부른 후에 변수에 ‘?’ 혹은 char(i + ‘A’)를 받는 과정으로 바꾸고 max는 i 인덱스가 받은 값(알파벳이 나온 횟수)를 받도록 바꾸어 최종제출을 했다.
메모
- length()는 strlen 함수와 다르게 1번만 호출되기 때문에 for문에 사용할 수 있지만 size_t 타입을 반환하기 때문에 int i가 아닌 size_t i로 작성해야 된다.
- char 변수도 초기화가 필요하다.