10808번: 알파벳 개수(BOJ C/C++)
사용 언어: C++
문제
알파벳 소문자로만 이루어진 단어 S가 주어진다. 각 알파벳이 단어에 몇 개가 포함되어 있는지 구하는 프로그램을 작성하시오.
입력
첫째 줄에 단어 S가 주어진다. 단어의 길이는 100을 넘지 않으며, 알파벳 소문자로만 이루어져 있다.
출력
단어에 포함되어 있는 a의 개수, b의 개수, …, z의 개수를 공백으로 구분해서 출력한다.
풀이에 앞서 설명
일단 c++로 처음 올리는 PS인데, 코드에 앞서 단순 설명을 하자면
ios::sync_with_stdio(false); //0
cin.tie(NULL); //0
cout.tie(NULL); //0
위의 세 문장은 PS를 할때 cin과 cout을 쓸때 발생할 수 있는 시간초과 문제 때문에 넣는 것이다. 단점도 분명 존재하지만 PS를 할 동안에는 신경 안 쓰기로 한다.
첫 번째 풀이
#include <bits/stdc++.h>
using namespace std;
int main(void)
{
ios::sync_with_stdio(0);
cin.tie(0);
string S;
cin>>S;
for(char i='a';i<='z';i++)
{
int cnt=0;
for(char c : S) //auto c
if(i==c)
cnt++;
cout<<cnt<<' ';
}
}
설명을 좀 하자면
for(char c : S) //auto c, c++11 이상에서만 사용 가능
이것은 문자열 S 안에 존재하는 모든 원소를 처음부터 끝까지 꺼내는 것이다.
두 번째 풀이
#include <bits/stdc++.h>
using namespace std;
int freq[26]; //전역으로 선언 안하면 직접 선언해줘야함 -> 그냥 0으로 채워짐.
int main(void)
{
ios::sync_with_stdio(0);
cin.tie(0);
string S;
cin>>S;
for(auto c : S) //auto c
freq[c-'a']++;
for(int i=0;i<26;i++)
cout<<freq[i]<<' ';
}
첫 번째 풀이도 문제는 없지만 굳이 배열을 26번 호출을 할 필요가 없다. 바로 두 번째 풀이처럼 한번의 호출로 배열에 필요한 위치에 ++를 하므로 사용 시간을 줄일 수 있다.
느낀 점
바킹독 c++ 강의를 들으면서 푸는 문젠데 확실히 잘 가르치신다. 근데 문제를 풀면서 느낀 스스로한테 문제점이 있다면 너무 성질이 급하다는 것이다. 조금 더 생각해보고 풀던지, 혹은 풀 방법이 생각나면 바로 코드를 작성하면서 이것이 될까?하면서 수정하는 것이 아닌 Pseudo 코드를 작성해보고 되겠다 싶으면 그때부터 구현에 신경을 써야겠다. 급하게 풀려니까 스스로 답답해지고 끝까지 생각하기 전에 다른 사람의 코드를 너무 쉽게 보게 되는 것 같다. 조금 더 여유롭게 공부하자(문제를 풀자).
'BOJ > 배열' 카테고리의 다른 글
1764번: 듣보잡 (BOJ C/C++) (0) | 2022.02.18 |
---|---|
1316번: 그룹 단어 체커 (BOJ C/C++) (0) | 2022.02.16 |
2941번: 크로아티아 알파벳 (BOJ C/C++) (0) | 2022.02.15 |
9935번: 문자열 폭발 (0) | 2022.01.28 |
10809번: 알파벳 찾기(BOJ C/C++) (0) | 2021.12.21 |