[백준 c++] 10808 알파벳 개수

jw·2022년 2월 3일
0

백준

목록 보기
2/141
post-thumbnail

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

문제 설명

문자열을 입력받고 해당 문자열에 포함되어있는 a의 개수,b의 개수,...z의 개수를 공백으로 구분해서 출력하는 문제다.

c++의 실행속도를 믿고 일단 무식하게 코드를 짜서 제출해봤는데 역시나 c++..정답처리되었다.😎

전체 코드

#include <iostream>
#include <algorithm>
#include<string>
using namespace std;
int a[26] = { 0, };
int main() {
	string s;
	cin >> s;
	for (int i = 0; i < s.length(); i++) {
		if (s[i] == 'a') a[0] += 1;
		if (s[i] == 'b') a[1] += 1;
              . . . 생략 . . .
		if (s[i] == 'z') a[25] += 1;
	}
	for (int i = 0; i < 26; i++) {
		cout << a[i] << " ";
	}
}

하지만 좀 더 똑똑하고 효율적으로 다시 코드를 짜보도록 하자.

#include <iostream>
#include <algorithm>
#include<string>
using namespace std;
int cnt[26] = { 0, };
int main() {
	string s;
	cin >> s;
    
	for (char a : s) { //s안에 있는 문자 a들을 순회할거라는 뜻
		cnt[a - 'a']++; 
	}
    
	for (int i : cnt) {
		cout << i << " ";
	}
}

범위 기반 for문을 이용하여 풀었다. (그냥 for문이랑 코드 길이가 짧다는 것 외에 기능 상 차이는 없다.)

	for (char a : s) { 
		cnt[a - 'a']++; 
	}

입력받은 문자열 s를 하나하나 뜯어볼건데 그 하나~하나~는 char a로 칭한다.
소문자는 아스키 코드를 가지기 때문에 arr[a] = arr[97]이고 arr[b] = arr[98] ... arr[z]=arr[123]이다.
알파벳 각각 개수를 저장하는 배열 cnt의 크기를 123으로 해서 cnt[a]++ 라고 할 수 있지만, 공간 낭비를 줄이기 위해 cnt[a-'a']++ 로 배열 index가 0~26을 갖도록 했다.

	for (int i : cnt) {
		cout << i << " ";
	}

cnt안에 있는 원소들을 공백으로 구분하여 출력하면 끝!

profile
다시태어나고싶어요

0개의 댓글