728x90
알파벳 개수
시간 제한 메모리 제한 제출 정답 맞힌 사람 정답 비율
1 초 | 256 MB | 33713 | 23145 | 19091 | 69.518% |
문제
알파벳 소문자로만 이루어진 단어 S가 주어진다. 각 알파벳이 단어에 몇 개가 포함되어 있는지 구하는 프로그램을 작성하시오.
입력
첫째 줄에 단어 S가 주어진다. 단어의 길이는 100을 넘지 않으며, 알파벳 소문자로만 이루어져 있다.
출력
단어에 포함되어 있는 a의 개수, b의 개수, …, z의 개수를 공백으로 구분해서 출력한다.
예제 입력 1 복사
baekjoon
예제 출력 1 복사
1 1 0 0 1 0 0 0 0 1 1 0 0 1 2 0 0 0 0 0 0 0 0 0 0 0
흐름
틀린 코드
#include <bits/stdc++.h>
using namespace std;
string in;
int p[30];
vector<char> split(string in){
vector<char> ret;
int size = in.length();
char c[100];
strcpy(c, in.c_str());
for(int i=0;i<size;i++){
ret.push_back(c[i]);
}
return ret;
}
int main(){
ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
//1. 문자 입력받기
cin >> in;
//2. 문자 한글자씩 쪼개기
vector<char> v = split(in);
//3. 글자를 int로 바꾸어 저장하기
for(char vv:v){
p[int(vv) - 97]++;
}
// //4.출력하기
for(int pp:p) cout << pp << " ";
return 0;
}
테스트 케이스는 맞았는데..
유의점
- 문자를 아스키코드로 바꾸고싶을땐 char형에서 int로 캐스팅한다.
선생님 코드
counting Star는 맵 또는 배열 -
수를 셀때는 맵 또는 배열 사용하기!
맵 : key value, 배열: cnt[1]++;
- Map은 String을 count할때 사용하기
- Array는 int를 count할때 사용하기 (문자 char 카운트 포함)
int여도 1000만정도의 크기이거나(배열의 공간복잡도 초과) 10만, 100만, 1000만처럼 빽빽하지않고 sparse할때는 map 사용하기
이 문제는 문자를 count하는데 char은 아스키코드인 int로 나타낼 수 있다.
=> Array 사용
아스키코드
문자를 숫자로 다룬다. (char -> int)
A : 65, a : 97 암기하기, 알파벳 개수 26개
a:97 ~ z:97+25=122
#include <bits/stdc++.h>
using namespace std;
int a[1004];
int main(){
ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
char c='a';
cout << (int)c << "\n"; //97
a['b'-'a']=30;
cout << a[1]; //30
return 0;
}
풀이 코드
#include <bits/stdc++.h>
using namespace std;
string str;
int cnt[26];
int main(){
ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
//1. 입력받기
cin >> str;
//2. 문자마다 빈도수 +1
for(char a:str){
cnt[a-'a']++;
}
//3. 출력하기
for(int i=0;i<26;i++) cout << cnt[i] << " ";
return 0;
}
- 문자열 string을 문자 char로 쪼갤때 범위형 for문을 사용할 수 있다.
- int형 배열일때 a['a']하면 자동으로 a[97]로 인식이 된다.
- 수 세는 변수는 cnt, 범위는 알파벳 개수만큼 26개로 선언하자.
- 짧은 코드를 작성해라.
피드백 후의 나의 코드
#include <bits/stdc++.h>
using namespace std;
string str;
int cnt[26];
int main(){
ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
//1. 문자열 입력받기
cin >> str;
//2. 문자로 쪼개서 빈도수 +1
for(char a:str){
cnt[a-'a']++;
}
//3. 출력하기
for(int ct:cnt) cout << ct << " ";
}
728x90
'알고리즘 > 알고리즘 문제풀이' 카테고리의 다른 글
11655번: ROT13 (0) | 2022.12.31 |
---|---|
1159번: 농구 경기 (2) | 2022.12.31 |
10998번 : 팰린드롬인지 확인하기 (0) | 2022.12.31 |
2979:트럭 주차 (1) | 2022.12.31 |
2309: 일곱 난쟁이 (0) | 2022.12.29 |