개발자/C or C++

백준 1157번 [C/C+]

Mosser 2021. 10. 5.
728x90
반응형

문제

해결 방법

이번 문제 같은경우에는 문자열을 입력받아서 문자의 빈도수를 출력하면 되는 문제입니다.

우선적으로

1. 초기에 선언한 array를 초기화

2. 입력받은 문자열의 소문자 부분을 대문자로 변환

 

 

 

여기에서 'a'가 숫자로 97번이고 'z'가 122번이므로 각각 32번을 빼면 대문자로 바꿀 수 있습니다.

또한 빈도수를 1올리는 코드 같은 경우에는

'A' 같은경우에는 count 배열에서는 0번째 인덱스에 속합니다.

그렇기 때문에 'A'-65=0 이 되므로 count 배열의 0번째 index의 값이 +1이 되는 식으로 빈도수를 추가하면 됩니다. 'B'같은 경우에는 'B'-65=1 이므로 1번째 index의 값이 +1이 되겠죠?

3. count 배열을 순환하면서 최대값을 구하고 중복 여부를 체크하는 부분입니다.

주석을 참고하시면 이해 될것입니다. 이해가 안되시면 배열 하나를 작성하셔서 손으로 따라해보시면 쉽게 이해되실겁니다.

4. 출력 같은경우에는 삼항 연산자를 사용하여 출력하였습니다.

flag 값이 true 이면 '?' 출력 아니면 alphaber[index] 문자 출력

 

소스코드

 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(){
	char str[1000000];
	char alphabet[26];
	int alphabet_count[26];
	char a='A';
	int i=0;
	
	//배열 초기화
	for(i=0;i<26;i++){
		alphabet[i]=a++;
		alphabet_count[i]=0;
	}
	
	
	
	//문자열 입력
	
	scanf("%s",&str);
	int len=strlen(str);
	
	

	for(i=0;i<len;i++){
		
			//입력받은 문자열에서 소문자를 대문자로 변환 
		if(str[i]>=97 && str[i]<=122)
			str[i]-=32;
		
		//해당 문자의 빈도수를 1올리는 코드
		alphabet_count[str[i]-65]++;
		
	}

	
	//alphabet_count 배열의 빈도수를 이용하여 최대값 구하기
	int max=alphabet_count[0];
	int flag=0; //최대값이 중복여부에 대한 flag 변수   
	int index=0;
	
	for(i=1;i<26;i++){
		//최대값이 바뀌면 중복여부에 대한 flag가 0으로 초기화
		if(max<alphabet_count[i]){
			max=alphabet_count[i];
			flag=0;
			index=i;
			continue;	
		}
		
		//만약 현재 최대값과 count 배열의 값이 같으면 최대값이 중복되므로 flag=1로 초기화
		if(max==alphabet_count[i]){
			flag=1;
		}
		
	}
	

	//flag=1이면 중복되므로 ? 출력 그외에는 해당 문자 출력
    printf("%c\n",(flag ? '?' : alphabet[index]));
	
	
	
	
	
}

실행결과

 

반응형

'개발자 > C or C++' 카테고리의 다른 글

백준 2675번 [C/C+]  (0) 2021.10.05
백준 10809번 [C/C+]  (0) 2021.10.05
백준 11720번 [C/C+]  (0) 2021.10.05
백준 11654번 [C/C+]  (0) 2021.10.05
백준 15596번 [C/C+]  (0) 2021.10.05

댓글