#30. [백준_C언어] 1157 : 단어 공부

 

 입력 코드 

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

main() {
	char s[1000000];
	int num[26] = { 0, };
	int i, j, max = 0;
	int max_index;

	scanf("%s", s);

	for (i = 'a'; i <= 'z'; i++) {
		for (j = 0; j < strlen(s); j++) {
			if (s[j] == i)
				num[s[j] - 'a']++;
		}
	}
	for (i = 'A'; i <= 'Z'; i++) {
		for (j = 0; j < strlen(s); j++) {
			if (s[j] == i)
				num[s[j] - 'A']++;
		}
	}

	for (i = 0; i < 26; i++) {
		if (num[i] > max) {
			max = num[i];
			max_index = i;
		}
		else if (num[i] == max) {
			max_index = -1;
		}
	}

	if (max_index != -1)
		printf("%c\n", max_index + 'A');
	else
		printf("\?\n");
}

 

 

 코드 설명 

#배열 #반복문 #아스키코드 #조건문 #형식지정자

 

2021/01/14 - [C] - #29. [백준_C언어] 10809 : 알파벳 찾기

앞에서 푼 10809번 문제와 비슷하다는 느낌을 계속 받았는데 하나가 안 풀리니까 계속 안 풀리는 것 같다.

#include <stdio.h>
#include <string.h>
#define SIZE 1000000;

main() {
	char s[SIZE];
	int num[26] = { 0, };
	int i, j, max = 0;

	scanf("%s", s);

	for (i = 'a'; i <= 'z'; i++) {
		for (j = 0; j < strlen(s); j++) {
			if (s[j] == i)
				num[s[j] - 'a']++;
		}
	}
	for (i = 'A'; i <= 'Z'; i++) {
		for (j = 0; j < strlen(s); j++) {
			if (s[j] == i)
				num[s[j] - 'A']++;
		}
	}

	for (i = 0; i < 26; i++) {
		if (num[i] > max) {
			max = num[i];
			printf("%s\n", 'A' + num[i]);
		}
		else if (num[i] == max) {
			printf("\?\n");
		}
	}
}

전역변수를 이용해서 배열의 크기를 설정하고 싶었는데 이 방법이 아닌 것 같고, 맞는 풀이를 찾아보려고 해도 이해가 가지 않아서 더 찾아봐야 할 것 같다. 

 

a~z, A~Z 횟수를 num 배열에 집어넣는 것까지는 맞는 것 같은데 그중에서 제일 많은 사용된 알파벳을 출력하는 게 문제였다. 가장 많이 사용된 알파벳이 여러 개일 경우로 나누는 것도.

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

main() {
	char s[1000000];
	int num[26] = { 0, };
	int i, j, max = 0;
	int max_index;

	scanf("%s", s);

	for (i = 'a'; i <= 'z'; i++) {
		for (j = 0; j < strlen(s); j++) {
			if (s[j] == i)
				num[s[j] - 'a']++;
		}
	}
	for (i = 'A'; i <= 'Z'; i++) {
		for (j = 0; j < strlen(s); j++) {
			if (s[j] == i)
				num[s[j] - 'A']++;
		}
	}

	for (i = 0; i < 26; i++) {
		if (num[i] > max) {
			max = num[i];
			max_index = i;
		}
		else if (num[i] == max) {
			max_index = -1;
		}
	}

	if (max_index != -1)
		printf("%c\n", max_index + 'A');
	else
		printf("\?\n");
}

찾아보니까 아예 새로운 변수를 설정해서 최댓값이 하나인 경우와 여러 개인 경우를 나눠서 풀었다.

 

1) 최댓값이 하나인 경우 num 배열에서 최댓값을 max에 저장하고 그 최댓값의 인덱스(i)를 max_index에 저장한 후에 나중에 대문자로 바꿔서 출력할 때 그 인덱스(i)에 'A'의 아스키코드(65)를 더해서 출력한다.

 

예를 들어 baaa에서 num={3,1,0,0,,,}일 것이고, max=3, max_index=0이 되어 밑에 if~else문에서 max_index!=-1 조건을 만족시켜서 0+65('A')=65 -> 'A'를 출력하게 되는 것이다.

 

2) 그리고 최댓값이 여러 개인 경우(num[i]==max인 경우) max_index = -1로 설정하고 밑에 if~else문에서 ?를 출력하게 되는 것이다.

 

 

사실 이거 정리하면서도 계속 헷갈려서 몇 번을 봤다.

☆10809번 문제랑 같이 봐 둬야 하는 문제

 

 

참고한 사이트

jwduck.tistory.com/34

 

[C/C++] C 언어 강좌 3. printf, scanf 함수 + 특수문자 & 서식문자

앞으로 갈 길이 많이 멀답니다 헤헤헤 오늘은 printf, scanf 함수에 대해 자세하게 알아보도록할게요. C 3. printf, scanf + 특수문자 & 서식문자 printf 함수 파헤치기 지난번 포스트에서 printf 함수에 대

jwduck.tistory.com

blog.naver.com/wlgh325/221335258219

 

[백준 알고리즘] 1157번 단어공부, c언어 문자열 다루기

문제 알파벳 대소문자로 된 단어가 주어지면, 이 단어에서 가장 많이 사용된 알파벳이 무엇인지 알아내는 ...

blog.naver.com

travelerfootprint.tistory.com/26

 

백준 알고리즘 1157번: 단어 공부 C언어

문제 출처: www.acmicpc.net/problem/1157 1157번: 단어 공부 알파벳 대소문자로 된 단어가 주어지면, 이 단어에서 가장 많이 사용된 알파벳이 무엇인지 알아내는 프로그램을 작성하시오. 단, 대문자와 소

travelerfootprint.tistory.com

 

 

 문제 출처 

www.acmicpc.net/problem/1157

 

1157번: 단어 공부

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

www.acmicpc.net