우사미 코딩

[C++] string을 구성하는 알파벳의 개수를 배열로 저장하는 방법 (lowercase) 본문

Programming (C++)/C++ 자료구조

[C++] string을 구성하는 알파벳의 개수를 배열로 저장하는 방법 (lowercase)

맑은 눈의 우사미 2023. 4. 17. 14:49
반응형

leetcode에서 anagram이나 permutation string 관련 문제를 풀 때 자주 사용한다

 

[anagram]

- anagram은 문자의 순서를 바꾸어 다른 단어나 문장을 만드는 것

- anagram문자를 구성하는 알파벳의 개수는 동일하나 배치를 다르게 한다

- "rac"은 "car"의 anagram이다

- "aab"는 "aba"의 anagram이다

 

 

[permutation in string - 순열]

- 순서가 부여된 임의의 집합을 다른 순서로 뒤섞는 연산

- "abc"의 permutation - "abc", "acb", "bac", "bca", "cab", "cba"

- n개의 char로 만들 수 있는 모든 string의 조합은 n!개이다

 

 

 

[string을 구성하는 char의 개수를 배열에 저장하기]

- 주어진 string은 "abce"라고 했을 때 아래의 그림처럼 char의 개수를 저장한다

- 알파벳의 "개수"를 저장할 벡터이므로 자료형은 "int"로 한다

v[0]은 a를  의미하고 v[1]은 b를 의미한다

 

 

1. 알파벳 a-z의 개수는 26개이므로 사이즈가 26인 vector를 선언하고 초기값을 0으로 설정한다

	vector<int> v(26, 0);

 

2. string을 순회하면서 해당하는 char의 index의 값을 1씩 증가시킨다 

	for (int i = 0; i < str.size(); i++) {
		int idx = str[i] - 'a'; // a가 0부터 시작하는 알파벳의 인덱스를 얻을 수 있다
		v[idx]++;
	}

 

3. 코드

using namespace std;
int main() {
	vector<int> v(26, 0); // 알파벳 a-z : 26개, 초기값 0
	string str = "abce";

	cout << "str : " << str << endl;
	cout << "- before : " << endl;
	for (auto i : v) {
		cout << i << " ";
	}
	cout << endl;

	for (auto c : str) {
		int idx = c - 'a';
		v[idx]++;
	}

	cout << "- after : " << endl;
	for (auto i : v) {
		cout << i << " ";
	}
	cout << endl;


	return 0;
}

 

 

 

4. 출력결과

    str : abce
    - before :
    0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
    - after :
    1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
반응형
Comments