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(0, 1); } //크기가 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/
질문이나 지적 있으시면 댓글로 남겨주세요~
도움 되셨으면 하트 꾹!
728x90
반응형