본문 바로가기
Programming/PS

[백준/BOJ] C언어/C++ 1157번 단어 공부 (strupr 에러)

by yoiii 2021. 2. 23.

#info

카테고리 : 단계별로 풀어보기 - 문자열 파트

난이도 : BRONZE1

사용언어 : C언어/C++

메모리 : 1980KB

시간 : 16ms


#소스코드

/* omyo(yomo) develop */ 
/* blog : https://omyodevelop.tistory.com */

#include <stdio.h>
#include <ctype.h>
#define LEN 1000001

int main(void){
	
	// <1> [INPUT] 문자열 입력 & 알파벳 배열 초기화 
	char str[LEN];
	int alphaArr[26] = {0,};
	scanf("%s",&str);
		
	// <2> 소문자 → 대문자 변경 
	for (int i = 0; str[i]; i++) { 
		if(islower(str[i])) str[i] = toupper(str[i]); 
	}
	
	// <3> 알파벳 개수 체크		
	for(int i=0; str[i]!=NULL; i++){
		alphaArr[str[i]-65] ++;
	}
	
	// <4> 가장 많이 나온 알파벳 계산 
	int MAX = 0;
	int index_MAX = 0;
	for(int j=0; j<26; j++){
		
		if(MAX < alphaArr[j]){
			MAX = alphaArr[j];
			index_MAX = j; 
		}
		
		else if(MAX==alphaArr[j] && alphaArr!=0){
			index_MAX = -1;
		}
	} 
	
	// <5> [OUTPUT]
	if(index_MAX != -1){
		printf("%c", 65+index_MAX);
	}
	
	else{
		printf("?\n");
	}
	
	return 0;
	
}

#풀이

알아보기 쉽게 소스코드를 5가지 구역으로 나누었습니다.

 

// <1> [INPUT] 문자열 입력 & 알파벳 배열 초기화 
	char str[LEN];
	int alphaArr[26] = {0,};
	scanf("%s",&str);

char형 배열을 통해 문자열을 입력받고, 길이가 26인 int형 alphaArr 배열을 선언과 동시에 모든 인덱스를 0으로 초기화합니다.

 

// <2> 소문자 → 대문자 변경 
	for (int i = 0; str[i]; i++) { 
		if(islower(str[i])) str[i] = toupper(str[i]); 
	}

 

islower 함수와 toupper 함수를 이용해, 입력받은 문자열을 모두 대문자로 바꾸어 줍니다.

처음에는 strupr 함수를 써서 대문자로 바꾸었는데, 백준 환경에서 돌려보니 컴파일 에러가 났습니다.

구글에 검색해 보니, strupr 함수는 표준함수가 아닌 비쥬얼 환경에서만 돌아가는 함수라서 LINUX 기반으로 채점을 진행하는 백준에서는 컴파일 에러가 발생한다고 하네요.

 

	// <3> 알파벳 개수 체크		
	for(int i=0; str[i]!=NULL; i++){
		alphaArr[str[i]-65] ++;
	}

 

for 반복문을 이용해 입력받은 문자열을 NULL문자를 만날 때 까지 돌려서 각 알파벳이 총 몇개가 있는 지 alphaArr에 저장합니다.

 

// <4> 가장 많이 나온 알파벳 계산 
	int MAX = 0;
	int index_MAX = 0;
	for(int j=0; j<26; j++){
		
		if(MAX < alphaArr[j]){
			MAX = alphaArr[j];
			index_MAX = j; 
		}
		
		else if(MAX==alphaArr[j] && alphaArr!=0){
			index_MAX = -1;
		}
	} 

 

 

알파벳의 개수가 저장된 alphaArr 배열을 for문으로 돌려 빈도수가 가장 높은 알파벳을 계산합니다.

 

// <5> [OUTPUT]
	if(index_MAX != -1){
		printf("%c", 65+index_MAX);
	}
	
	else{
		printf("?\n");
	}

  

마지막으로 출력 부분입니다.

대문자 A가 아스키로 65인것을 고려하여, 문제가 제시한 조건에 맞게 출력합니다.


#문제

www.acmicpc.net/problem/1157

 

1157번: 단어 공부

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

www.acmicpc.net


댓글