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

heige·2024년 1월 19일
0

BOJ

목록 보기
41/46
post-thumbnail

문제

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

풀이

내 풀이

#include<bits/stdc++.h>
using namespace std;   
int cnt[26];
int main() {
	string alp = "abcdefghijklmnopqrstuvwxyz";
	string S;
	cin >> S;

	for (int i = 0; i < S.length(); i++) 
		for (int j = 0; j < 26; j++) 
			if(S[i] == alp[j])
				cnt[j]++;
	
	for (int i : cnt) 
		cout << i << " ";
	return 0;
}
  • 알파벳 카운팅 할 26개 크기의 배열 선언
  • alp 문자열 선언
  • 입력 받은 S 길이 만큼 루프 돌면서 알파벳과 비교
  • 알파벳과 일치하면 cnt 배열의 해당 인덱스의 값을 1씩 증가

➡️ 코드가 너무 복잡하고 무겁다. 꼭 중첩 for문 사용하지 않아도 될 것 같은데.

강의 풀이

#include<bits/stdc++.h>
using namespace std;  
typedef long long ll;  
string str; 
int cnt[26];
int main(){
    ios_base::sync_with_stdio(false); 
    cin.tie(NULL); 
    cout.tie(NULL);
    cin >> str; 
    for(char a : str){
    	cnt[a - 'a']++; 
	}
	for(int i = 0; i < 26; i++) cout << cnt[i] << " ";
	 
	return 0; 
}

a~z : 아스키코드 97~122
코드처럼 a-'a' 하면 97-97(0) ~ 122-97(25) 범위

아스키코드

대문자 A는 65, 소문자 a는 97
이것만 외워두기.

되게 간단하네. 복잡도도 개선되고

💡 배운 내용

카운트 관련

CountingStar는 맵 또는 배열
Count 할 경우에 맵이나 배열을 쓰는 게 좋다.
Map은 key, Value 형태로 이뤄져있다. a는 몇 개, 이런 식으로 카운팅.
String이 몇 개인지를 셀 때는 Map, int를 셀 때는 Array가 좋다.
(10만, 100만, 1000만 이런 식으로 띄엄띄엄 input이 들어올 땐 Map을 쓰는 게 좋다.)이 문자는 문자열을 기반으로 '문자'를 카운팅하기 때문에 Array를 쓴다.

배열을 전역으로 선언해야 하는 이유

배열을 지역변수로 선언 후, 초기화 하지 않고 코드를 실행했는데 값이 이상하게 나왔다.(쓰레기값이 들어감)
전역으로 할당할 경우 자동으로 모든 값이 0으로 초기화가 된다.
특별한 초기화 값이 없으면 0으로 초기화 된다.
프로그램이 시작할 때 만들어졌다가 프로그램이 종료될  때 함께 사라진다.
지역변수로 선언하면 스택에 생성되어 스택의 크기 제한에 따라 런타임에러가 생기지반 전역변수로 선언하면 힙 영역에 생성되어 그 제한으로부터 자유롭다.

profile
웹 백엔드와 클라우드 정복을 위해 탄탄한 기반을 쌓아가고 있는 예비개발자입니다. 'IT You Up'은 'Eat You Up'이라는 표현에서 비롯되어, IT 지식을 끝까지 먹어치운다는 담고 있습니다.

0개의 댓글