[코딩테스트] 백준 1157 단어공부 -C++

Coffee Time☕·2021년 4월 29일
0

코딩테스트

목록 보기
35/42

문제 풀이

  • 입력으로 주어진 알파벳의 횟수가 가장 많은 것을 구하는 문제이다.
  • 대소문자는 구분되지 않는다
  • 최대 알파벳의 개수가 동일한 경우 ? 를 출력한다.
  • 해결 방법
    1. int arr[26]을 만들어 arr[0] 은 a 부터 arr[25]는 z까지를 의미하며 각 횟수를 담는 배열을 만든다.
    2. 문자열을 차례로 탐색하면서 arr배열에 개수를 추가한다.
    3. arr배열을 탐색하면서 max를 탐색한다.
    - 주의할 점
    주어진 단어의 길이 알아내기 위해 strlen이라는 함수를 이용했다. 이 함수는 문자열 저음부터 문자열의 길이까지 탐색하는 함수이다. 따라서 문자열의 길이를 탐색하는데 시간이 걸리기 때문에 for 과 같은 반복문의 조건으로 들어가게 되면 시간이 초과되는 것을 볼 수 있다.. 미리 계산하여둔 변수를 이용하는 것이 좋다.
    string.h 헤더 파일에 있는 함수이다. visual studio 와 같은 ide를 이용할 경우, 내장 되어 있으나, gcc 컴파일러를 이용하는 경우에는 반드시 헤더파일을 include 해주어야 이용가능하다.

C++ 코드

#include <iostream>
#include <string.h> 
#include <algorithm>
#define MAX_SIZE 1000000
using namespace std; 

char word[MAX_SIZE];

int main() {
	// 소문자 대문자 
	// 97- 65 = 32 

	//단어의 길이 1000000을 넘지 않는다. 
	int alphabet[26] = { 0 };
	int max_index = 0;
	int max = 0;
	int unique = 0; 
	cin >> word;

	//strlen함수는 string.h헤더에 포함되어 있다. - gcc인 경우 수동 추가하기 
	int s_length = strlen(word);
	
	sort(word, word + s_length);

	//반복문에 strlen 함수를 추가하면 안된다. 
	// strlen은 문자열 처음~string길이 까지 찾기에 O(L^2) 를 가진다.
	for (int i = 0; i < s_length; i++) {
		//대문자 일 경우 소문자 변환
		if (97 <= word[i] && word[i] <= 129)
			word[i] -= 32;
		// 알파벳 개수 추가 
		alphabet[word[i] - 65]++;
	}
	max = *max_element(alphabet, alphabet+26);


	for (int i = 0; i < 26; i++) {
		if (alphabet[i] == max) {
			max_index = i;
			unique++;
		}
	}


	if (unique > 1)cout << "?\n";
	else
		cout <<char(max_index+65) <<"\n";


	return 0;
}

0개의 댓글

관련 채용 정보