본문 바로가기

algo

samsung sw academy 최대상금 문제 C++

(제발 공부좀 하고 블로그 꾸준히 쓰자 ㅠ)

개인적인 해결책이니 참고만 하시길 바랍니다.
건설적인 비판과 의견은 대환영입니다 :)

문제

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV15Khn6AN0CFAYD 

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

모든 케이스를 다 고려해야하는 브루트 포스(brute force -brute : 무식한 -force : 힘 (== 나) ) 알고리즘을 활용해야 하는데, 시간초과 문제를 해결하기 위해 특정 조건을 통해 이후 확인을 하지 않도록 해야한다. (백트래킹..? 아무튼)
나는 특정 카운트시에 같은 값을 검색한 이력이 있다면 해당 이후는 뿌리내리지 않도록 조건을 걸었다.

코드

#include <iostream>
#include <string>
#include <vector>

using namespace std;

int cha_num, s_size;
string S;
int res = -1;
vector<int> storedata[11];

void func(int cnt, string ts) {
	int t_res = stoi(ts);
	if (cha_num == cnt) {
		res = t_res > res ? t_res : res;
		return;
	}
	for (int i = 0; i < storedata[cnt].size(); i++) {
		if (storedata[cnt][i] == t_res) {
			return;
		}
	}
	storedata[cnt].push_back(t_res);
	for (int i = 0; i < s_size; i++) {
		for (int j = i + 1; j < s_size; j++) {
			swap(ts[i], ts[j]);
			func(cnt + 1, ts);
			swap(ts[i], ts[j]);
		}
	}
}

int main() {

	cin.tie(0);
	ios::sync_with_stdio(0);
	
	cin >> S >> cha_num;
	s_size = S.length();
	int num_order[6];
	int cnt;
	for (int i = 0; i < cha_num; i++) {
		storedata[i].clear();
	}
	func(0, S);
	cout << res << endl;
	return 0;
}

시간을 더 단축하기위한 조건이 많이 있을것 같은데 혹시나 아이디어 있으면 공유부탁드립니다 :)

반응형

'algo' 카테고리의 다른 글

SWEA(SW Expert Academy) string C++  (0) 2021.09.17
SW Expert Academy Magnetic C++  (0) 2021.09.16
SW Expert Academy 균형점 C++  (0) 2021.09.15