※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※

 

이번에 볼 문제는 백준 6443번 문제인 애너그램이다.

문제는 아래 링크를 확인하자.

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

 

6443번: 애너그램

첫째 줄에 단어의 개수 N 이, 둘째 줄부터 N개의 영단어가 들어온다. 영단어는 소문자로 이루어져 있다. 단어의 길이는 20보다 작거나 같고, 애너그램의 수가 100,000개 이하인 단어만 입력으로 주

www.acmicpc.net

입력으로 영단어가 주어질 때 이 영단어를 구성하는 알파벳을 순서만을 바꿔 만들 수 있는 문자열들을 한 번씩 사전순으로 출력하는 문제이다.

 

주어진 단어를 구성하는 알파벳의 종류와 그 등장 횟수를 기록하고, 이를 이용해 모든 순열을 사전순으로 탐색하는 것으로 문제를 해결할 수 있다.

 

문자열을 정렬하면 알파벳의 종류와 등장 횟수를 찾아내는 구현을 간단히 할 수 있다.

 

아래는 제출한 소스코드이다.

#include <iostream>
#include <string>
#include <algorithm>
using namespace std;

int lettercnt, slen;
char c[20];
int cnt[20];
string s = "";

void func(int len) {
	if (len == slen) {
		cout << s << '\n';
		return;
	}

	for (int i = 0; i < lettercnt; i++) {
		if (cnt[i]) {
			cnt[i]--;
			s += c[i];
			func(len + 1);
			s.pop_back();
			cnt[i]++;
		}
	}
}

void solve() {
	string tmp; cin >> tmp;
	sort(tmp.begin(), tmp.end());

	lettercnt = -1, slen = tmp.length();
	char old = '\\';
	for (auto l : tmp) {
		if (l != old) {
			old = l;
			lettercnt++;
			c[lettercnt] = l;
			cnt[lettercnt] = 0;
		}
		cnt[lettercnt]++;
	}
	lettercnt++;

	func(0);
}

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);

	int T; cin >> T;
	while (T--) {
		solve();
	}
}
728x90

'BOJ' 카테고리의 다른 글

[BOJ 24377 // C++] ИГРА  (0) 2022.02.11
[BOJ 24378 // C++] КАСТИНГ  (0) 2022.02.11
[BOJ 1947 // C++] 선물 전달  (0) 2022.02.09
[BOJ 10978 // C++] 기숙사 재배정  (0) 2022.02.08
[BOJ 24441 // C++] 행운 수 판정  (0) 2022.02.07

+ Recent posts