백준/단계별

[C++] 백준 1157

loasd 2022. 12. 10. 21:44
반응형

백준 1157번 문제 단어공부이다.

 

https://www.acmicpc.net/problem/1157

 

1157번: 단어 공부

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

www.acmicpc.net


 < 문제 >

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

단, 대문자와 소문자를 구분하지 않는다.

 

 < 예제 >

예제를 보면 문제가 이해가 된다.

첫번째 예제 Mississipi에서 s가 4개, i가 4개로 최대 빈도수인 단어가 2개이기 때문에 ?가 출력이 된다.

두번째 예제 zZa에서 대소문자 구분 없이 z가 가장 많기 때문에 Z가 출력된다.

 

바로 코드를 보도록 하자.

#include <iostream>
#include <string>
using namespace std;

int main() {

	string str;
	cin >> str;

	int str_arr[26] = { 0, };
	int max = 0;
	int count = 0;
	int max_index = 0;

	// 입력된 str을 str_arr 배열에 저장
	for (int i = 0; i < str.length(); i++) {
		int int_str = str[i];
		if (int_str >= 97) {
			str_arr[int_str - 97]++;		//소문자
		}
		else
			str_arr[int_str - 65]++;		//대문자
	}

	// 최대값 찾기
	for (int j = 0; j < 26; j++) {
		if (str_arr[j] > max) {
			max = str_arr[j];
		}
	}

	// 배열에 최대값이 같은게 몇개 있는지 확인
	for (int k = 0; k < 26; k++) {
		if (str_arr[k] == max) {
			count++;
			max_index = k;
			if (count >= 2) {
				cout << "?" << endl;		// count가 2 이상일 경우 ?출력 후 종료
				return 0;
			}
		}
	}
	cout << (char) (max_index + 65) << endl;

	return 0;
}

먼저 문자열을 입력받고 배열에 저장한다.

이 과정에서 문자를 숫자로 바꿔야 되는데 ASCII코드가 사용된다.

이전에 업로드한 게시글에 표를 정리해두었는데

 

2022.12.10 - [백준/단계별] - [C++] 백준 11720

 

[C++] 백준 11720

백준 11720번 문제 숫자의 합이다. https://www.acmicpc.net/problem/11720 11720번: 숫자의 합 첫째 줄에 숫자의 개수 N (1 ≤ N ≤ 100)이 주어진다. 둘째 줄에 숫자 N개가 공백없이 주어진다. www.acmicpc.net < 문제 >

loasd.tistory.com

여기서 확인하면 된다.

 

우선 대문자, 소문자 상관 없이 넣기 위해서 입력된 문자의 ASCII가 97이상이면 97을 빼서 배열에 입력되게 하였고

그 외는 대문자의 ASCII시작이 65이기 때문에 65를 빼주었다.

 

그리고 최대값을 찾는 for문. 이제 익숙해서 금방금방 작성한다.

 

마지막으로 배열의 최대값을 검증하는 코드이다.

구한 최대값과 str_arr[0]부터 str_arr[26]까지의 값중 max와 같은 코드가 있을때마다 count가 1씩 증가한다.

그리고 2가 되면 배열에 최대값이 같은게 2개이상 있다는 뜻이므로 ?를 출력하고 종료를 한다.

count가 2이상이 되지 않는다면 count한 시점의 인덱스를 저장하고 char형식으로 바꿔서 출력한다.

(이때 65를 더한 이유는 ASCII의 대문자 A가 65이기 때문이다.)

 

나름 고민하면서 작성했는데 다른분들이 풀이해놓은것과 거의 유사해 뭔가 뿌듯하면서도 아리송하긴하다.ㅋㅋ

 

반응형

'백준 > 단계별' 카테고리의 다른 글

[C++] 백준 2908  (0) 2022.12.17
[C++] 백준 1152  (0) 2022.12.16
[C++] 백준 2675  (0) 2022.12.10
[C++] 백준 10809  (1) 2022.12.10
[C++] 백준 11720  (0) 2022.12.10