본문 바로가기

백준 C++

[백준/C++] 10808 : 알파벳 개수

   문제   

알파벳 소문자로만 이루어진 단어 S가 주어진다.

각 알파벳이 단어에 몇 개가 포함되어 있는지 구하는 프로그램을 작성하시오.

 

   입력   

첫째 줄에 단어 S가 주어진다. 단어의 길이는 100을 넘지 않으며, 알파벳 소문자로만 이루어져 있다.

 

   출력   

단어에 포함되어 있는 a의 개수, b의 개수, …, z의 개수를 공백으로 구분해서 출력한다.

 

   예제   

 


   코드   

#include <bits/stdc++.h>
using namespace std;

// int freq[26];

int main(void) {
	ios::sync_with_stdio(0);
	cin.tie(0);

	string s;
	int freq[26] = { 0 };

	cin >> s;

	/*
	for (int i = 0; i < s.length(); i++) {
		freq[s[i] - 'a']++;
	}
	*/
	for (auto c : s) {
		freq[c - 'a']++;
	}

	for (int i = 0; i < 26; i++) {
		cout << freq[i] << ' ';
	}
}

알파벳 별로 빈도수를 계산해서 출력하기 때문에 배열 freq의 크기를 알파벳 개수인 26으로 설정하고, 0으로 초기화시킨다. 참고로 전역변수에서 설정하면 '={}'이나 '={0}'을 해주지 않아도 자동으로 0으로 초기화된다.

 

나는 알파벳 개수를 세는 반복문의 실행 횟수를 설정하기 위해 s.length()를 이용했다.

하지만 정답 코드에서는 auto 키워드범위 기반 반복문(Ranged-based for loops)을 사용해 더 간단하게 반복문을 실행한다.

 

auto는 int, float 등으로 타입을 정해주지 않아도 알아서 데이터 타입을 추론해 정해주는 키워드이다.

범위 기반 for 문은 아래와 같은 형식에서 각 array의 요소를 반복하여 element_declaration에 선언된 변수에 현재 배열 요소의 값을 할당한다.

(최상의 결과를 얻으려면 element_declaration이 배열 요소와 같은 자료형이어야 한다. 그렇지 않으면 형 변환이 발생한다.)

for (element_declaration : array)
    statement;

 

따라서 for(auto c : s) 라는 코드는 배열 s의 요소의 데이터타입을 추론해 변수 c의 자료형이 정해지고, 그 변수 c에 배열 요소의 값이 할당됨을 의미한다.

 

앞으로 이 반복문을 자주 사용해봐야겠다!

 

 

문제 출처: https://www.acmicpc.net/problem/10808

 

 

10808번: 알파벳 개수

단어에 포함되어 있는 a의 개수, b의 개수, …, z의 개수를 공백으로 구분해서 출력한다.

www.acmicpc.net

 

범위 기반 for문 내용 출처: https://boycoding.tistory.com/210 [소년코딩:티스토리]
 

C++ 07.18 - 범위 기반 for 문 (range-based for statement)

범위 기반 for 문 (range-based for statement) '06.06 - for 문' 포스트에서 for 문을 사용하여 배열의 각 요소를 반복하는 예제를 봤다. #include int main() { const int numStudents = 5; int..

boycoding.tistory.com

 

'백준 C++' 카테고리의 다른 글

[백준/C++] 10093 : 숫자  (0) 2022.10.23