티스토리 뷰

728x90
반응형

백준 온라인 저지(BOJ) 1157번 단어 공부

https://www.acmicpc.net/problem/1157

 

1157번: 단어 공부

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

www.acmicpc.net

* 사용언어 : C언어, C++

 

1. 문제

알파벳 대소문자로 된 단어 중 가장 많이 사용된 알파벳을 출력

대문자 소문자는 구분하지 않음

 

2. 풀이

반복문, 조건문 그리고 ASCII 코드에 대한 이해가 필요한 문제입니다.

ASCII 테이블에 따라 'a' 는 97 이고 'A' 는 65 입니다.

 

0 ~ 25 를 index 로 하는 int 형 배열을 선언해둡니다.

 

그리고 입력받은 단어를 한 글자 씩 확인하면서

'a' 거나 'A' 면 선언한 int 형 배열 0번 자리에 +1,

'b' 이거나 'B' 이면 1번 자리에 +1,

...

'z' 이거나 'Z' 이면 25번 자리에 +1 을 해줍니다.

(코드에서는 ++ 전위 증가로 처리했습니다)

 

만약 입력된 단어가 zZa 였다면 해당 배열에는

0번(A)에 1, 25번(Z)에 2, 그리고 나머지 자리는 0이 기록되어 있을 것 입니다.

 

모든 문자를 처리한 뒤 가장 많이 사용된 알파벳을 확인하기 위해

기록된 int 형 배열을 탐색합니다.

 

이 문제가 일반적인 최대값 찾는 문제와 다른 점은 아래 2가지 입니다.

 1) max 값이 아닌 index(몇 번째 자리가 가장 큰 지)를 출력해야한다는 점

 2) max 값이 2개 이상인 경우 ? 를 출력해야한다는 점

 

이 2가지를 모두 처리하기 위해서 cnt, idx 변수를 추가로 두고

코드를 작성했습니다.

 

나머지 부분은 아래 코드를 통해 확인해보시면 됩니다.

 

3. 코드

#ifndef _CRT_SECURE_NO_WARNINGS
#define _CRT_SECURE_NO_WARNINGS
#endif
/*
1157_단어 공부
1972KB	16ms
*/
#include <cstdio>

int main() {
#ifdef _WIN32
	freopen("input.txt", "r", stdin);
#endif // _WIN32
	char s[1000000];
	int a[26] = { 0, };

	scanf("%s", &s);

	int i = 0;
	while (s[i]) {
		if (s[i] >= 'a') ++a[s[i] - 'a'];
		else ++a[s[i] - 'A'];
		++i;
	}

	int max = 0, cnt = 0, idx;
	for (int i = 0; i < 26; ++i) {
		if (a[i] > max) {
			idx = i;
			max = a[i];
			cnt = 1;
		}
		else if (a[i] == max) {
			cnt++;
		}
	}

	if (cnt > 1) printf("?\n");
	else printf("%c\n", idx + 'A');

	return 0;
}

 

728x90
반응형
댓글