728x90

 0. [c++] sw 8383 - 숫자 선물


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


 1. 풀이


설명은 주석으로 최대한 적어놓았다.


뺄셈과 비슷하게 숫자가 남으면 뒤를 전부 y를 채우는 느낌으로 코드를 만들어보았다.

아래에 erase가 활용되었는데, ret.erase(int a, int b)는 a의 위치부터 b개를 삭제한다는 의미이다.



 2. 소스코드


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
95
96
97
98
99
100
101
102
103
104
#include<iostream>
#include<algorithm>
#include<string>
 
using namespace std;
 
int main(int argc, char** argv)
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);
 
    int test_case;
    int T;
    cin >> T;
 
    string N;
    int x, y;
    
    for (test_case = 1; test_case <= T; ++test_case)
    {
        cin >> N >> x >> y;
        string ret;
        cout << "#" << test_case << " ";
        for (int i = 0; i < N.size(); i++) {
            //첫자리가 y보다 크면 모든 자리에 y를 집어넣는다.
            if (N[i] - 48 > y) {
                for (i; i < N.size(); i++)
                    ret.push_back(y + 48);
            }
            //이번 자리가 y라면, 우선 y를 집어넣고 다음으로 넘긴다.
            else if (N[i] - 48 == y) {
                ret.push_back(y + 48);
            }
            //이번 자리가 x보다 크다면, x를 집어넣고 그 뒤는 모두 y로 채운다.
            else if (N[i] - 48 > x) {
                ret.push_back(x + 48);
                i++;
                for (i; i < N.size(); i++) {
                    ret.push_back(y + 48);
                }
            }
            //이번 자리가 x와 같다면, x를 집어넣고 다음으로 넘긴다.
            else if (N[i] - 48 == x) {
                ret.push_back(x + 48);
            }
            //모든 경우에 속하지 않은 경우
            else if (N[i] - 48 < x) {
                //만일 출력할 것이 없는 경우라면, 한 자리를 넘긴 후 모두 y로 채운다.
                //왜냐하면 ret이 비어있다는 소리는 i가 0이라는 것이다.
                //이때, N의 입력은 (1<=N)으로 이후의 가장 큰 수는 y로 모든 자리를 채운 수이기 때문이다.
                if (ret.size() == 0) {
                    i++;
                    for (i; i < N.size(); i++) {
                        ret.push_back(y + 48);
                    }
                }
                //출력할 숫자가 있는 경우, y를 x로 바꾸어주고, 이 아랫자리의 수는 전부 y로 채워준다.
                else {
                    //위치를 찾기위한 변수 선언
                    int order = -1;
                    for (int j = 0; j < ret.size(); j++) {
                        //가장 아래에 위치하는 y를 찾아주자.
                        if (ret[j] - 48 == y) {
                            order = j;
                        }
                    }
                    //만일 y가 존재하지 않는다면, 한자리를 지우고, 모든 수를 y로 채워준다.
                    if (order == -1) {
                        ret.pop_back();
                        for (int j=0; j < ret.size(); j++) {
                            ret[j] = y + 48;
                        }
                        for (i; i < N.size(); i++) {
                            ret.push_back(y + 48);
                        }
                    }
                    //맨 위에 말한듯이 가장 아래의 y를 x로 변화시킨 후, 모든 자리를 y로 채워준다.
                    else {
                        ret[order++= x + 48;
                        for (order; order < ret.size(); order++) {
                            ret[order] = y + 48;
                        }
                        for (i; i < N.size(); i++) {
                            ret.push_back(y + 48);
                        }
                    }
                    
                }
            }
        }
 
        //만일 x가 0인 경우를 고려하여, 맨 앞이 0이라면 삭제해준다.
        while (ret[0- 48 == 0) {
            ret.erase(01);
        }
 
        //크기가 0(출력할 것이 없는 경우)인 경우 -1을 출력하자.
        if (ret.size() == 0)
            cout << -1 << "\n";
        else
            cout << ret <<"\n";
    }
    return 0;//정상종료시 반드시 0을 리턴해야합니다.
}
cs


 3. 참고


- erase활용   

http://www.cplusplus.com/reference/string/string/erase/


질문이나 지적 있으시면 댓글로 남겨주세요~

도움 되셨으면 하트 꾹!


+ Recent posts