본문 바로가기
Computer Science

A응실 최대상금 / 구현

by OKOK 2018. 12. 17.

1. 예외처리

2. 문제 유형 파악

3. 초기 변수 설정

4. 단순하게 풀이 가능

5. 인풋 아웃풋 확인

6. 스스로 문제 풀어보는 것 좋음 


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
//최대 상금 
#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 = 0int min = 9999int 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 == 0break;
            //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);
        }
    }
}
 
cs


댓글