상세 컨텐츠

본문 제목

[백준] 1157번 단어 공부 (c++)

프로그래밍/백준 c++

by montgras 2021. 7. 7. 20:59

본문

반응형

[문제] https://www.acmicpc.net/problem/1157

 

1157번: 단어 공부

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

www.acmicpc.net

 


[풀이]

(선언)

- 단어를 입력받을 string(word)

- 알파벳 개수를 카운트할 알파벳 배열(abt[27])

- 최대값(max_n)과 해당 알파벳(max)을 저장할 int 정수

 

1. 단어를 입력받는다.

2. 입력받은 단어의 알파벳 개수를 count

3. 알파벳 배열 전체를 돌리면서 max에 최대

 


 

(전체 코드)

#include <iostream>
#include <string>

using namespace std;

int main() {
	string word; //단어 저장
	int abt[26] = { 0, }; //알파벳 등장 횟수 카운트
	int max = 0, max_n = 0; //최댓값 확인용, 최댓값 개수(여러개면 '?'출력)
	int max_a; //max 알파벳 저장

	cin >> word; //단어 입력
	for (int i = 0; i < word.length(); i++) { //알파벳 카운트
		if ((int)word[i] > 64 && (int)word[i] < 91) abt[(int)word[i] - 65]++;
		else if ((int)word[i] > 96 && (int)word[i] < 123) abt[(int)word[i] - 97]++;
	}

	for (int i = 0; i < 26; i++) { //최대값 확인
		if (abt[i] > max) {
			max = abt[i];
			max_n = 1;
			max_a = i;
		}
		else if (abt[i] == max) { //최대값이 여러 개면 카운트
			max_n++;
		}
	}

	if (max_n > 1) cout << "?" << endl;
	else cout << char(max_a+65) << endl;


	return 0;
}

int와 char를 서로 변경하는 방식은 여러 가지가 있다. 그 중에서 내가 사용한 방식은 아래 두 가지이다.

 

1. 명시적 자료형 변환

2. 아스키코드를 활용한 변형

 

사실 두가지라고 볼 수 있는지 잘 모르겠지만, 암튼 저렇게 사용했다.

 

for (int i = 0; i < word.length(); i++) { //알파벳 카운트
		if ((int)word[i] > 64 && (int)word[i] < 91) abt[(int)word[i] - 65]++;
		else if ((int)word[i] > 96 && (int)word[i] < 123) abt[(int)word[i] - 97]++;
	}

if문 안에 있는 조건은 int에 괄호를 넣어서 만든 명시적 변환을 사용했다. 알파벳 전부를 따로 if문 처리하는 방식도 있겠지만 26번이나 조건문을 달기에는 무리가 있고, 연속적인 범위이기 때문에 굳이 그 방식이 필요하지도 않다. 때문에 아스키코드를 사용해 각각 소문자와 대문자인 경우를 따로 지정해 대소문자 구분 없이 횟수를 카운트하는 배열을 채워줬다.

 

형변환에는 이번 문제에서 내가 사용한 명시적 변환도 있지만, 묵시적 변환이라는 방법도 있다.

-묵시적 형 변환

묵시적 변화는 괄호 없이 그냥 넣어주기만 하면 된다. 다만 이 경우에는 데이터 손실 때문에 경고 문구가 뜨기 때문에 나는 잘 사용하지 않는다.

반응형

관련글 더보기

댓글 영역