백준 1157번 : 단어 공부
문제 출처
https://www.acmicpc.net/problem/1157
아스키코드를 이용해서 소문자랑 대문자를 나누고 check로 알파벳의 개수를 세주었다.
check중 가장 큰 수를 찾고
가장 여러번 나온 알파벳이 여러개인지 검사를 했다.
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
int main()
{
char word[1000001];
char ans = 'A';
int check[26] = { 0 };
int i, max, count = 0;
scanf("%s", word);
for (i = 0; i < strlen(word); i++) {
if (word[i] > 91)
check[word[i] - 97]++;
else
check[word[i] - 65]++;
}
max = check[0];
for (i = 1; i < 26; i++) {
if (check[i] > max) {
max = check[i];
ans = i + 65;
}
}
for (i = 0; i < 26; i++) {
if (check[i] == max) {
count++;
break;
}
}
if (count == 1) {
printf("%c\n", ans);
}
else
printf("?\n");
}
시간초과가 났다. 반복문이 3개나 있는데 당연한 결과일듯...
밑에 두 for문은 그렇다 쳐도 첫번째 for문의 경우 strlen만큼 돌면 만약 단어의 길이가 최대 길이로 나온다면 백만번이나 돌게된다.
여기에서 시간 단축할 방법을 찾아야 할거 같았는데 결국 방법이 생각나지 않아 질문게시판을 봤다.
해결법은 너무나도 예상외...
strlen(word)이 바로 시간을 많이 잡아 먹는다는 것.
for문에 strlen을 바로 사용하게 되면 조건문을 확인 할때마다 매번 word의 길이를 다시 연산하게 되는거다.
길이를 저장할 변수를 하나 만들고 거기에 strlen(word)를 담아두고 변수를 for문에 사용하니 맞았다.
너무나도 허무하지만 변수를 적절하게 사용하는 법을 배운문제...
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
int main()
{
char word[1000001];
char ans = 'A';
int check[26] = { 0 };
int i, max, count = 1;
int len;
scanf("%s", word);
len = strlen(word);
for (i = 0; i < len; i++) {
if (word[i] > 91)
check[word[i] - 97]++;
else
check[word[i] - 65]++;
}
max = check[0];
for (i = 1; i < 26; i++) {
if (check[i] == max) {
count++;
}
if (check[i] > max) {
max = check[i];
ans = i + 65;
count = 1;
}
}
if (count == 1) {
printf("%c\n", ans);
}
else
printf("?\n");
}
'문제풀이 > 코딩테스트' 카테고리의 다른 글
프로그래머스 신규 아이디 추천 [Java] (0) | 2022.02.13 |
---|---|
프로그래머스 신고 결과 받기 [Java] (0) | 2022.02.11 |
백준 1932번 : 정수 삼각형 (0) | 2021.05.28 |
백준 1654번 : 랜선 자르기 [C언어] (0) | 2021.05.28 |
백준 11726번 : 2xn 타일링 [C언어] (0) | 2021.03.18 |