문제
알파벳 대소문자로 된 단어가 주어지면, 이 단어에서 가장 많이 사용된 알파벳이 무엇인지 알아내는 프로그램을 작성하시오. 단, 대문자와 소문자를 구분하지 않는다.
입력
첫째 줄에 알파벳 대소문자로 이루어진 단어가 주어진다. 주어지는 단어의 길이는 1,000,000을 넘지 않는다.
출력
첫째 줄에 이 단어에서 가장 많이 사용된 알파벳을 대문자로 출력한다. 단, 가장 많이 사용된 알파벳이 여러 개 존재하는 경우에는 ?를 출력한다.
풀이
<정답풀이>
#include <iostream>
#include <algorithm>
#include <stdio.h>
using namespace std;
int used[200];
int maxi = -21e8;
int maxIndex;
int flag = 0;
char check;
int main()
{
string str;
cin >> str;
transform(str.begin(), str.end(), str.begin(), ::toupper);
int len = str.length();
for (int i = 0; i < len; i++)
{
used[str[i]]++;
}
for (int i = 0; i < len; i++)
{
if (maxi == used[str[i]] && check != str[i])
{
flag=1;
//check = used[str[i]];
}
if (maxi < used[str[i]])
{
maxi = used[str[i]];
check = str[i];
maxIndex = i;
flag=0;
}
}
if (flag == 1)
{
cout << "?";
}
else {
cout << str[maxIndex];
}
return 0;
}
<오답풀이>
어려웠던 이유: 예외조건이 정확히 어디에 들어가야 하는지 어려웠다.
#include <iostream>
#include <algorithm>
using namespace std;
int used[200];
int maxi = -21e8;
int maxIndex;
int flag = 0;
int check;
int main()
{
string str;
cin >> str;
transform(str.begin(), str.end(), str.begin(), ::toupper);
int len = str.length();
for (int i = 0; i < len; i++)
{
used[str[i]]++;
}
for (int i = 0; i < len; i++)//len까지 범위가 이상한건가
{
if (maxi == used[str[i]])
{
flag=1;
check = used[str[i]];
}
if (maxi < used[str[i]])
{
maxi = used[str[i]];
maxIndex = i;
}
}
if ((flag == 1)&&(maxi<=check))
{
cout << "?";
}
else {
cout << str[maxIndex];
}
return 0;
}
내 코드의 문제점은 만약 'aAz'를 쳤을 때 첫 번째 for문이 돌다가 maxi < used[str[i]] 부분에서 maxi가 2가 된다.
그다음 두 번째 for문이 돌 때 maxi == used[str[i] 되어버려서 플래그가 1이 된다. 이때 , 바로 첫 번째 for문에서 'a' 문자의 최댓값을 2라고 구해버렸는데 두 번째 for문에서 같은 문자의 최댓값인 2와 비교해버리는 상황이 발생한다. 같은 문자의 최댓값끼리 비교했으니 코드 마지막에서는 반드시 flag가 1로 나오게 되기 때문에 버그가 생긴다!
따라서, flag=0이 되는 코드를 추가해줘야하고 같은 문자의 최댓값끼리 비교하는 상황을 피해야 하는데 이 과정이 좀 헷갈렸다. check 변수를 만들었지만 삽입을 잘못 한듯..
참고할만한 글
-내가 쓴 코드와 남이 쓴 코드를 어떻게 비교해볼까?
'Algorithm > C++' 카테고리의 다른 글
프로그래머스 - 2017 팁스타운 -예상 대진표 - C++ / 기본 수학 (0) | 2021.06.27 |
---|---|
백준 - 10250- ACM 호텔 - C++/ 나머지, 몫 활용 (0) | 2021.03.08 |
백준 - 4344 - 평균은 넘겠지 - C++ / 2차원 배열 동적 할당 (0) | 2021.03.08 |
백준 - 2869 - 달팽이는 올라가고 싶다 - C++ /시간초과, 수식활용 (0) | 2021.03.08 |
백준 - 2941 - 크로아티아 알파벳 - C++ /String 내부 함수 find, replace (0) | 2021.03.06 |
댓글