본문 바로가기
Algorithm/C++

백준 - 1157 - 단어공부 - C++ /예외조건삽입

by imagineer_jinny 2021. 3. 7.

1157번: 단어 공부 (acmicpc.net)

 

1157번: 단어 공부

알파벳 대소문자로 된 단어가 주어지면, 이 단어에서 가장 많이 사용된 알파벳이 무엇인지 알아내는 프로그램을 작성하시오. 단, 대문자와 소문자를 구분하지 않는다.

www.acmicpc.net

문제

알파벳 대소문자로 된 단어가 주어지면, 이 단어에서 가장 많이 사용된 알파벳이 무엇인지 알아내는 프로그램을 작성하시오. 단, 대문자와 소문자를 구분하지 않는다.

입력

첫째 줄에 알파벳 대소문자로 이루어진 단어가 주어진다. 주어지는 단어의 길이는 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 변수를 만들었지만 삽입을 잘못 한듯.. 

 

 

참고할만한 글

-내가 쓴 코드와 남이 쓴 코드를 어떻게 비교해볼까?

m.blog.naver.com/PostView.nhn?blogId=tkdldjs35&logNo=221315853167&proxyReferer=https:%2F%2Fwww.google.com%2F

 

[ 백준 알고리즘 ] 1157번 :: 단어 공부 ( C++ )

# 단어 공부 - 문자열을 처리하는 방법에 대한 문제입니다. 쉬운 듯 하면서도 정답비율은 34%로써 조금 난...

blog.naver.com

 

댓글