while(1) work();
반응형

링크

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

 

SW Expert Academy

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

swexpertacademy.com

 

분류

완전 탐색

 

개인적 난이도

매우 쉬움 쉬움 보통 어려움 매우 어려움

 

핵심 알고리즘

완전 탐색을 이용해 바꿀 수 있는 모든 경우의수를 고려한다.

Combination(6, 2) ^ 10의 값이 5.77 E+11 로 매우 크기 때문에 cache를 사용하였다.

 

시행착오

완전탐색보다 더 효율적인 알고리즘이 있지 않을까 라는 생각에

많은 고민을 했지만 최대 자릿수는 6자리, 최대 교환 횟수는 10회로 제한되어 있었기 때문에 완전탐색으로 해결하였다.

코드

#include<iostream>
#include<map>

using namespace std;

int len;
map<int, int> cache;

int swap(int N, int x, int y){
	int vx, vy, mx = 1, my = 1;
	for (int i = 1; i < x; i++) mx *= 10;
	for (int i = 1; i < y; i++) my *= 10;
	vx = (N / mx) % 10;
	vy = (N / my) % 10;

	return N - vx * mx - vy * my + vx * my + vy * mx;
}

int solve(int N, int cnt){
	if (cache.find(N * 100 + cnt) != cache.end()) return cache.at(N * 100 + cnt);
	if (!cnt) return N;

	int max = -1;

	for (int i = 2; i <= len; i++){
		for (int j = 1; j < i; j++){
			int s = swap(N, i, j);
			s = solve(s, cnt - 1);
			max = (max < s)?s:max;
		}
	}

	cache[N * 100 + cnt] = max;

	cnt--;
	return max;
}

int main(int argc, char** argv){
    int tc, T;
    scanf("%d", &T);

    for (tc = 1; tc <= T; ++tc)
    {
        int N, cnt;
		scanf("%d %d", &N ,&cnt);

		cache.clear();
        int i = N;
		len = 0;
		while (i > 0){
			len++;
			i /= 10;
		}

		printf("#%d %d\n", tc, solve(N, cnt));
    }

    return 0;
}
반응형

'알고리즘 > SW Expert Academy' 카테고리의 다른 글

3282. 0/1 Knapsack  (0) 2022.02.16
3304. 최장 공통 부분 수열  (0) 2022.02.16
4408. 자기 방으로 돌아가기  (0) 2022.02.16
1970. 쉬운 거스름돈  (0) 2022.02.16
1230. 암호문3  (0) 2022.02.16
profile

while(1) work();

@유호건

❤️댓글은 언제나 힘이 됩니다❤️ 궁금한 점이나 잘못된 내용이 있다면 댓글로 남겨주세요.

검색 태그