본문 바로가기
개인 공부/코딩테스트

[C++][백준 1157][문자열 처리] 단어 공부 :: seoftware

by seowit 2020. 2. 16.

 문제 

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

 

1157번: 단어 공부

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

www.acmicpc.net

 소스 

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>

using namespace std;

int main(void) {
	string input;
	cin >> input;
	
	string alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";

	vector<int> v(26, 0);

	for (int i = 0; i < input.length(); i++) {
		int idx = 0;
		//대문자
		if (input[i] >= 'A' && input[i] <= 'Z') {
			idx = input[i] - 'A';
		}
		else {
			idx = input[i] - 'a';
		}
		v[idx]++;
	}
	int max = 0; int max_idx = 0;
	for (int i = 0; i < v.size(); i++) {
		if (v[i] > max) {
			max = v[i];
			max_idx = i;
		}
	}

	sort(v.begin(), v.end());
	if (v[24] == v[25]) cout << '?';
	else cout << alphabet[max_idx];

	return 0;
}

 

1. 이번 코드에서는 저번에 아쉬웠던 알파벳을 배열로 받은 걸 string으로 고쳤다. 훨씬 깔끔해!

2. input[i] >= 'A'input[i] >= 'A' && input[i] <= 'Z' : 이런식으로 비교를 하면 아스키코드가 비교가 되어 아스키코드가 A보다 크고 Z보다 큰 문자들을 의미한다. 따라서 A, B, C, ... , X, Y, Z 가 저 범위에 속하게 되는 것이다.

3. 대소문자 구분이 없기 때문에 a와 A의 인덱스를 같도록 했다.

4. 인덱스를 input[i] - 'a' 이런식으로 잡으면 a의 아스키 코드 값이 빼지는 것으로 input[i] 가 a 이면 인덱스가 0이 되고 input[i] 가 b 이면 인덱스가 1이 된다. 

댓글