기록장

[C++] 100개의 알파벳 랜덤 생성 후 개수 세기 (리스트, 배열, 데이터타입 형변환) 본문

코딩 공부/C++

[C++] 100개의 알파벳 랜덤 생성 후 개수 세기 (리스트, 배열, 데이터타입 형변환)

민j 2023. 3. 7. 22:11

- 100개의 임의의 소문자를 생성하고 문자 배열에 대입

- 배열 내의 각 문자에 대해 발생 빈도를 계산

 

-> 2개의 배열 필요

-> 문자를 chars[100] 배열에 저장

-> 각 문자의 발생 빈도를 counts[26]에 저장

#include <iostream>
#include <ctime>
using namespace std;

// 'a'=97 'z'=122 알파벳 26개

int main()
{
	char chars[100];
	int counts[26] = { 0 }; //counts에는 0=a ~ 25=z 로 설정

	srand(time(0));

	for (int i = 0; i < 100; i++) //100개의 소문자 알파벳 랜덤 생성, chars에 저장
	{
		int number = 97 + (rand() % 26); //소문자 a는 유니코드로 97이므로 97+@로 저장한다.
		chars[i] = number;
	}

	for (int i = 0; i < 26; i++) //counts 배열을 반복
	{
		for (int j = 0; j < 100; j++) //chars 배열을 반복
		{
			if (chars[j] == i + 97) //예를 들어 i=0, j=0 반복에서 chars[0]이 97(=a)이면 counts[0](=a) 1씩 증가
				counts[i]++; 
		}
	}

	int total = 0; //100개가 맞게 생성됐는지 확인용
	for (int i = 0; i < 26; i++)
		total += counts[i];

	for (int i = 0; i < 26; i++)
		cout << counts[i] << " " << static_cast<char>(i + 97) << endl; //알파벳 개수와 알파벳 출력
	cout << "total is " << total;


	return 0;
}

 

나는 counts 리스트 사이즈를 26으로 지정하고, 인덱스 0~25를 각각 a~z라고 가정했다.

counts[0]은 a, counts[1]은 b, ... counts[25]은 z

그리고 알파벳 'a'의 유니코드가 97이므로 인덱스+97=알파벳 인 점을 이용했다.

예를 들어, counts[3]의 알파벳은 3+97=100이고, 알파벳 'd'이다.

 

100개의 랜덤 생성 알파벳은 chars 리스트에 저장했고

중첩 for문을 이용해 각각 counts[0]~[25] 일 때 chars[0]~[99]를 반복한다.

ex. chars[]가 counts[]에 해당하는 알파벳이라면 counts[]++을 한다.

3 a
4 b
2 c
7 d
:

결과는 이런 식으로 나온다.


- static_cast<char>(99) 데이터타입 형변환 사용

- 배열의 인덱스와 유니코드의 특징 사용

- srand(time(0)) 난수 생성