//최대 상금
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
char inputStr[7] = { 0, };
int num;
int len = 0; //string 길이
int flag1 = 0; //해당구간 동일한 max 개수 체크!!
int flag2 = 0; //max값 개수 check 2개 이상인지 체크!!(max값 하나라도 0, max값 두개 이상이면 1)
int main()
{
freopen("input.txt", "r", stdin);
int testcase = 0;
scanf("%d", &testcase);
//testcase = 1;
int i, j, k; char ch;
for (int abc = 0; abc<testcase; abc++)
{
//init
for (i = 0; i<7; i++)inputStr[i] = 0;
flag2 = 0;
int max = 0; len = 0; int min = 9999; int minIndex = 0;
scanf("%s", inputStr); //input data
scanf("%d", &num); //교환횟수
while (inputStr[++len]);
for (k = 0; k <= len - 2; k++) //배열개수 하나적게 만큼
{
int maxIndex = -1;
flag1 = 0;
max = inputStr[k] - '0'; //하나뽑고
for (i = k + 1; i<len; i++) //하나뽑은거 오른쪽으로 보기 -> 더 최대값 있는지 본다!!
{
if (inputStr[i] - '0' > max) {
max = inputStr[i] - '0';
maxIndex = i;
flag1 = 0;
}
else if (inputStr[i] - '0' == max) // 최대값 2개일 경우!! 맨 마지막 인덱스랑 바꾸기
{
maxIndex = i;
flag1++;
flag2 = 1;
}
}//end for i
//if else문 : 최대값이 2개 이상일 때랑 최대값 있을 때만 바꿈
if (flag1>0) //maxIndex까지의 위치 중에 최소값의 위치를 찾자. //((maxIndex전까지 가장 작은 값이랑 교환!)
{
min = 99999; minIndex = -1;
for (j = 0; j <= maxIndex; j++)
{
if (inputStr[j] - '0' < min) {
min = inputStr[j] - '0';
minIndex = j;
}
}
//swap
ch = inputStr[minIndex];
inputStr[minIndex] = inputStr[maxIndex];
inputStr[maxIndex] = ch;
num--;
}
else if (maxIndex != -1) //max값이 하나일때!! (원래 선택한 거랑 교환)
{
//swap
ch = inputStr[k];
inputStr[k] = inputStr[maxIndex];
inputStr[maxIndex] = ch;
num--;
}
//교환횟수 감소 !
if (num == 0) break;
//printf("%s\n", inputStr);
}//end for k
/*마지막 예제
456789 10
1회전 ) -> 956784 / num은 9
2회전 ) -> 986754 / num은 8
3회전 ) -> 987654 / num은 7
4회전 ) -> 그대로
5회전 ) -> 그대로
*/
//num은 남은 교환횟수임!!!!짝수면 그냥 그대로 출력하면 됨
if (num % 2 == 0 || flag2 == 1)
printf("#%d %s\n", abc + 1, inputStr);
else //남은 교환 횟수가 홀수 일때는 맨마지막 것 2개 바꾸기!! // 마지막 예제 최종답: 987645
{
//printf("마지막 %s\n", inputStr);
ch = inputStr[len - 2];
inputStr[len - 2] = inputStr[len - 1];
inputStr[len - 1] = ch;
printf("#%d %s\n", abc + 1, inputStr);
}
}
}
댓글