소스코드
#include <stdio.h>
#include <string.h>
int main (){
char a[1000000];
int b[26];
int i, temp, ans;
int c = 0;
int d = 0;
int len;
for(i=0; i<26; i++){
b[i] = 0;
}
scanf("%s", &a);
len = strlen(a);
for (i=0; i<len; i++){
if (a[i]>='A' && a[i]<='Z') a[i] = a[i]-'A'+'a';
temp = a[i] - 97;
b[temp]++;
}
for(i=0; i<26; i++){
if (c < b[i]) {
c = b[i];
ans = i;
}
}
for(i=0; i<26; i++){
if (c == b[i] && i != ans) d = 1;
}
if (d == 1) printf("?");
else printf("%c", ans+65);
}
일단... 계속 틀렸던 이유는 strlen(a) 를 조건문에 집어넣어서 시간 초과가 떴고, 그러면 안된다는 걸 깨닫고 len변수를 선언하고 값을 len에 저장한뒤에 계산했는데.. 문제가 strlen(a) 를 a 스캔 이후에 넣었어야 했는데 그 위에 넣어서 strlen(a) 값이 0이 되어 버림... 그럼 두번째 for loop이 안돌아간다.. 그것도 모르고 잘 나오던 게 왜 안나오나 했다... 코드수정할 때 위치 잘 보자. 그리고 if 조건문에서는 ==, !=, <= >=, <, >만 사용가능. = 넣으면 안돌아감!
해설
우선 변수들을 설정하고, 알파벳 개수 index 배열의 모든 값을 0으로 설정한다.
배열에 영문자를 받고, for문을 이용해 우선 알파벳대문자인 친구들을 모두 소문자로 바꿔준다. ('A' 보다 크고 'Z' 보다 작으면 모두 대문자. 소문자로 만들려면 'A'를 빼주고 대신 'a' 를 더해주면 됨)
모두 소문자로 값들을 바꿨으면, 해당 알파벳 개수 index 배열에 값을 더해준다. a[i]-97 하면 index 숫자를 얻을 수 있음. ('a' 의 ASCII CODE가 97이라서)
index에 알파벳 개수를 저장했으면, 이제 for문을 이용해 index가 가장 큰 알파벳을 찾아준다.
그리고 for문을 한번 더 써서 index가 가장 큰 알파벳과 동일한 개수가 등장하는 알파벳이 있는지 찾아준다.
있으면 ?, 없으면 +65를 해서 대문자가 출력되도록 하면 끝.
'solving > C, C++' 카테고리의 다른 글
[백준] 2609번 최대공약수와 최소공배수 (0) | 2022.08.29 |
---|---|
[백준] 2798번 블랙잭 (0) | 2022.08.29 |
[백준] 10809번 알파벳 찾기 (ASCII 코드로 소-대문자, 소문자-숫자 변환) (0) | 2022.08.27 |
[백준] 3052번 나머지 (다시 풀어볼 것) (0) | 2022.08.27 |
[백준] 2908번 상수 (atoi, sprintf, 문자열 선언) (0) | 2022.08.27 |