본문 바로가기
CodingTest/백준

[c++] 백준 - 1157번: 단어 공부

by Daybreak21 2023. 5. 10.

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

1157번: 단어 공부

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

www.acmicpc.net

전체코드

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

int main() {
	int array[26] = { 0, };		
	char word[1000000], max_index = 0; 
	cin >> word;
	int len = strlen(word), max_num = 0, count = 0; 
	for (int i = 0; i < len; i++) if (word[i] >= 'a' && word[i] <= 'z') word[i] -= 32;    
	for (int j = 0; j < len; j++) array[word[j]-'A']++;	   

	for (int i = 0; i < 26; i++) {	
		if (array[i] > max_num) {
			max_num = array[i];
			max_index = i;
		}
	}

	for (int i = 0; i < 26; i++) if (array[i] == max_num) count++; 
	count > 1 ? printf("?") : printf("%c", max_index + 65);

	return 0;
}

for (int i = 0; i < len; i++) if (word[i] >= 'a' && word[i] <= 'z') word[i] -= 32;​

 

단어배열의 값이 소문자에 해당하면 아스키코드 값을 32를 빼주어 대문자로 만들어주었다.

 

for (int j = 0; j < len; j++) array[word[j]-'A']++;

array는 알파벳순서대로 등장횟수를 저장하는 배열이다. 
array[word[j] - 'A'] : 단어의 알파벳에 'A'를 빼주어 인덱스로 사용하였다. 

 

for (int i = 0; i < 26; i++) {	
		if (array[i] > max_num) {
			max_num = array[i];
			max_index = i;
		}
	}

단어에서 가장 많이 사용된 알파벳(인덱스로 저장)과 횟수를 저장하는 코드이다. 
최댓값을 구하는 방식을 활용하였다. 

 

for (int i = 0; i < 26; i++) if (array[i] == max_num) count++; 
	count > 1 ? printf("?") : printf("%c", max_index + 65);

가장 많이 사용된 알파벳이 1개 이상이면 '?'를 출력하고, 아니라면 위에서 저장한 array의 최댓값 index에 65를 더해 알파벳 대문자를 출력해준다. 

 


 

위에껀 옛날에 썻던 코드이고 
밑에껀 지금 고친코드이다 
이중반복문을 없애고 코드를 좀 고쳤더니 코드줄은 1/2로 줄었고, 시간도 미미하지만 4ms가 줄었다.. 
더 효율적인 코드를 쓸 수 있도록 노력해야겠다 !!