입력 코드
#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번 문제랑 같이 봐 둬야 하는 문제☆☆
↓↓↓ 참고한 사이트
[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
문제 출처
1157번: 단어 공부
알파벳 대소문자로 된 단어가 주어지면, 이 단어에서 가장 많이 사용된 알파벳이 무엇인지 알아내는 프로그램을 작성하시오. 단, 대문자와 소문자를 구분하지 않는다.
www.acmicpc.net
'C' 카테고리의 다른 글
#32. [백준_C언어] 2908 : 상수 (0) | 2021.01.16 |
---|---|
#31. [백준_C언어] 1152 : 단어의 개수 (0) | 2021.01.16 |
#29. [백준_C언어] 10809 : 알파벳 찾기 (0) | 2021.01.14 |
#28. [백준_C언어] 4673 : 셀프 넘버 (1) | 2021.01.13 |
#27. [백준_C언어] 15596 : 정수 N개의 합 (0) | 2021.01.13 |