본문 바로가기
[PS] 문제풀이/백준

[ 백준 16496 ] 큰 수 만들기 (C++)

by 안산학생 2019. 12. 3.

[문제보기]

 

[해결과정]

 1. string 배열을 활용하여 입력 값을 받는다.

 

 2. sort STL을 사용하여 sort 시킨다. sort 할 때 비교 함수 cmp 정의를 다음과 같이 한다.

  2-1. sort할 string 변수 2개를 각 각 a와 b로 설정한다.

  2-2. a+b 그리고 b+a를 하여 이 두개의 값을 비교한다.

  2-3. a+b가 크다면 a를 앞에, b+a가 크다면 b를 앞에 배치시킨다.

 

 3. 모두 0으로 입력 되있을 경우 예외처리로 flag 변수를 둔다.

 

[소스코드]

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
#include<iostream>
#include<algorithm>
#include<string>
using namespace std;
 
const int MAX = 1001;
 
int n;
string s[MAX];
 
// 정렬 방식
bool cmp(string a, string b) {
    // 숫자가 같다면 continue;
    if (a == b) return false;
 
    // 숫자가 다르다면 글자를 a b 순으로 붙여보고, b a 순으로 붙여본다.
    // 그래서 ab 혹은 ba 중에 큰 것 경우의 숫자를 앞으로 배치.
    string ab = a + b;
    string ba = b + a;
    if (ab > ba) return true;
    else return false;
}
 
int main() {
 
    ios_base::sync_with_stdio(false);
    cin.tie(NULL); cout.tie(NULL);
 
    cin >> n;
 
    cin.ignore();
 
    //입력 값이 모두 0인 경우 체크 해주는 flag...
    int flag = 0;
    for (int i = 0; i < n; i++) {
        cin >> s[i];
        if (s[i] != "0") flag = 1;
    }
 
    if (flag == 0cout << 0;
    else {
        //정렬
        sort(s, s + n, cmp);
        for (int i = 0; i < n; i++)    cout << s[i]; 
    }
    return 0;
}
 

 

[해결 과정 중 실수한 부분]

 전체적으로 sort 하는데, cmp함수에서 a와 b의 길이를 비교하고 작은 길이인 수에서 작은 길이 -1, 큰 길이 에서 작은 길이.. 즉 s1[b] 와 s2[b-1] 를 비교 했는데.. 메모리 오류가 발생했다. return 하는 과정에서 문제가 있었던 것 같다. 이 과정을 해결하려하다.. 번뜻 떠오른 아이디어가 위 해결 과정이였다.

 

 원래 하려했던 과정 같은 경우 어차피 끝 길이만 비교하기에 숫자가 많았을 경우 중간 숫자는 넘겨버리는 문제가 발생했을 것이다.

 

[관련 문제 혹은 비슷한 문제]

비슷한 문제 : 백준 2812 - 크게 만들기

 

댓글