본문 바로가기

Algorithm/Back Tracking

BaekJoon 1342 행운의 문자열

Link https://www.acmicpc.net/problem/1342

소스결과 1984 KB / 260 ms

출처 Baekjoon

언어 C++ 17

분류 백트래킹 탐색

 

설명

문자열 S의 문자를 재 배치 하였을 때 모든 문자가 인접한 문자와 같지 않은 문자열의 개수를 찾는 문제

 

문자열을 재 배치 할 때 현재 위치를 기준으로 양옆을 생각하지 않고 이전 문자가 무엇 이었는지만 기억 하면 된다.

문자열을 진짜로 재 배치 한다는 생각보다 앞자리부터 하나씩 문자를 넣어 간다는 점이면 충분하다.

백트래킹을 연습하기에는 괜찮은 문제

 

문제 조건에서는 문자열의 범위가 주어지지 않지만 테스트 케이스로 주어지는 문자는 알파벳 소문자에 한정되었다.

 

알고리즘

1. 주어진 문자열의 각 알파벳의 개수를 저장한다.

2. 0번 인덱스부터 재귀호출로 이전 문자의 값과 일치하지 않는 알파벳 중 개수가 0이 아닌 알파벳을 현재 위치의 알파벳으로 처리한다.

3. 처리하는 인덱스가 마지막 위치까지 도달한다면 행운의 문자열로 간주하고 개수를 1 늘린다.

4. 출력

 

소스코드

#include <iostream>
#include <string.h>

using namespace std;

const short MAX = 10;
const short ALPHA_MAX = 26;
int inputLength;
int alpha[ALPHA_MAX];

int solve(char before, int pos)
{
	int count = 0;

	if (pos == inputLength)
		++count;
	else
	{
		for (int i = 0; i < ALPHA_MAX; i++)
		{
			if (alpha[i] < 1 || 'a' + i == before)
				continue;
			
			--alpha[i];
			count += solve('a' + i, pos + 1);
			++alpha[i];
		}
	}

	return count;
}

int main()
{
	char input[MAX + 1] = { };

	cin >> input;

	inputLength = strlen(input);

	for (int i = 0; i < inputLength; i++)
		alpha[input[i] - 'a']++;

	cout << solve(0, 0);

	return 0;
}

 

'Algorithm > Back Tracking' 카테고리의 다른 글

BaekJoon 1339 단어 수학  (0) 2019.02.08
BaekJoon 2661 좋은수열  (0) 2019.01.21
BaekJoon 2580 스도쿠  (0) 2019.01.11
BaekJoon 1759 암호만들기  (0) 2019.01.11
BaekJoon 9663 N-Queens  (0) 2018.12.31