본문 바로가기

Notice
Recent Posts
Recent Comments
«   2024/05   »
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
Tags
더보기
Archives
관리 메뉴

2870. 수학숙제 본문

알고리즘 문제풀기/백준(Acmicpc)

2870. 수학숙제

알광(Algwang) 2019. 1. 25. 11:41

문제링크 : https://www.acmicpc.net/problem/2870


< 입력 >


줄의 개수 (1<=N<=100)


N개의 문자열(숫자 + 소문자)


< 출력 >


문자열에 포함된 숫자들을 비내림차순으로 정렬하여 출력


< 풀이 >


파싱 연습을 위한 간단한 문제이다.


여기서 중요한 것은 어떻게 숫자를 뽑아낼 것인가 / 뽑아낸 숫자를 어떻게 정렬할 것인가이다.


먼저 숫자를 뽑아내는 것은 라인별로 입력을 받아서 숫자를 쌓고 있음을 의미하는 bool 변수


flag를 만든다. 숫자를 만날 경우 flag를 true로 하고 temp(string)에 숫자를 쌓는다.


그리고 문자를 만날 경우 flag를 false로 바꿔주며 숫자가 끝났음을 표시하고


만들어진 문자열(숫자)의 앞에 0을 제거해준다. (문자열의 길이를 통해 0 하나만 있을 경우 예외처리)


문자를 만나지 않았지만 라인이 끝났을 경우는 flag를 통해 확인할 수 있다.


다음으로 정렬은 2개의 string을 입력변수로 받는 compare함수를 만들어서 std::sort 함수를 사용했다.


길이 비교를 통해 먼저 구분하고 길이가 같을 경우 string operator <를 사용했다.


compare 함수 만들어서 sort에 넣는거 처음해봤는데 너무 편하다..





- 소스 코드 -


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
/*
 * string에서 숫자를 추출해서 정렬하는 문제입니다.
 * 먼저 문자열에서 숫자를 뽑아내는 과정은
 * 숫자를 만날경우 flag를 true로 바꾸고 string에 추가합니다.
 * 그리고 문자를 만날 경우 flag를 false로 해줌과 동시에
 * 한 자리 0을 제외하고 나머지 숫자들의 앞 0들을 substr을 이용해서 제거해주고
 * vector에 넣어주는 방법을 사용했습니다.
 * 정렬은 compare 함수를 구성해서 길이 비교 -> 값 비교의 순서로 진행했습니다.
*/
 
#include<iostream>
#include<string.h>
#include<vector>
#include<algorithm>
 
using namespace std;
 
vector<string> strarr;
 
bool compare(string a,string b){
    int aLen=a.length();
    int bLen=b.length();
    if(aLen>bLen){
        return false;
    }else if(aLen<bLen){
        return true;
    }else{
        return a<b;
    }
}
 
int main(void){
    int n;
    cin>>n;
    for(int l=0;l<n;l++){
        char line[101];
        scanf(" %s",line);
        string temp="";
        bool flag=false;
        for(int i=0;i<strlen(line);i++){
            if(line[i]>='0'&&line[i]<='9'){
                temp+=line[i];
                flag=true;
            }else{
                if(flag){
                    while(true){
                        if(temp.length()>1&&temp.at(0)=='0'){
                            temp=temp.substr(1,temp.length()-1);
                        }else{
                            break;
                        }
                    }
                    strarr.push_back(temp);
                }
                flag=false;
                temp="";
            }
        }
        if(flag){
            while(true){
                if(temp.length()>1&&temp.at(0)=='0'){
                    temp=temp.substr(1,temp.length()-1);
                }else{
                    break;
                }
            }
            strarr.push_back(temp);
        }
    }
    sort(strarr.begin(),strarr.end(),compare);
    for(int i=0;i<strarr.size();i++){
        printf("%s\n",strarr.at(i).c_str());
    }
}
cs





'알고리즘 문제풀기 > 백준(Acmicpc)' 카테고리의 다른 글

2018. 수들의 합 5  (0) 2019.01.28
2004. 조합 0의 개수  (0) 2019.01.28
1431.시리얼 번호  (0) 2019.01.24
1309.동물원  (0) 2019.01.22
11060. 점프 점프  (0) 2019.01.18
Comments