1일1알

백준 17359번 전구 길만 걷자 C++ 본문

알고리즘

백준 17359번 전구 길만 걷자 C++

영춘권의달인 2022. 5. 14. 14:26

출처 : https://www.acmicpc.net/problem/17359

 

백트래킹을 이용해서 모든 수를 이어붙여서 한번에 검사하면 시간초과가 난다.

일단 각각의 문자열들의 전구가 바뀌는 횟수를 저장하고 각각의 문자열의 맨 앞과 뒤만 비교하는 방식을 이용해서 문제를 해결하였다.

 

#include <iostream>
#include <string>
#include <vector>
#include <math.h>
#include <algorithm>
#include <utility>
#include <stack>
#include <queue>
#include <math.h>
#include <set>
#include <map>
#include <unordered_map>
#include <unordered_set>
#include <iomanip>

using namespace std;
using ll = long long;

int n;
vector<string> strs(10);
vector<int> swaps(10);
vector<bool> visited(10, false);
vector<int> idxs;
int ans = 987654321;

void BT() {
	if (idxs.size() >= n) {
		int cnt = 0;
		for (int i = 0; i < n - 1; i++) {
			cnt += swaps[i];
			if (strs[idxs[i]][strs[idxs[i]].length() - 1] != strs[idxs[i + 1]][0]) cnt++;
		}
		cnt += swaps[n - 1];
		ans = min(ans, cnt);
		return;
	}
	for (int i = 0; i < n; i++) {
		if (visited[i]) continue;
		idxs.push_back(i);
		visited[i] = true;
		BT();
		idxs.pop_back();
		visited[i] = false;
	}
}

int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);

	cin >> n;
	for (int i = 0; i < n; i++) {
		cin >> strs[i];
		int cnt = 0;
		char lastLight = strs[i][0];
		for (int j = 0; j < strs[i].length(); j++) {
			if (strs[i][j] != lastLight) cnt++;
			lastLight = strs[i][j];
		}
		swaps[i] = cnt;
	}
	BT();
	cout << ans;
};

'알고리즘' 카테고리의 다른 글

백준 2470번 두 용액 C++  (0) 2022.05.17
백준 24954번 물약 구매 C++  (0) 2022.05.16
백준 11728번 배열 합치기 C++  (0) 2022.05.13
백준 10819번 차이를 최대로 C++  (0) 2022.05.12
백준 2417번 정수 제곱근 C++  (0) 2022.05.11