<알고리즘 문제풀이&연습>/[C++] 백준, 프로그래머스 등등

[백준 5648] 역원소 정렬

BlockDMask 2017. 11. 29. 12:49
반응형
  • 안녕하세요. BlockDMask 입니다.

  • 오늘은 역원소 정렬이라는 문제를 풀어봤습니다.

0. 제목

  • 백준 5648 역원소 정렬

  • BOJ 5648 역원소 정렬

  • reverse and sort

1. 문제 설명

  • 모든 원소가 양의 정수인 집합이 있을 때, 
    원소를 거꾸로 뒤집고 그 원소를 오름차순으로 정렬하는 프로그램을 작성하세요.
    단, 원소를 뒤집었을 때 0이 앞에 선행되는 경우는 0을 생략해야 합니다.

  • 입력
    첫 번째로 입력되는건 n (1<=10^6 <= n)으로 사용자가 뒤이어 입력할 원소 값을 결정합니다.
    입력하는 줄에는 하나의 원소값 뿐만 아니라 여러 원소 값도 들어갈 수 있습니다.
    단, 입력하는 정수는 10^12를 넘어서는 안 됩니다.

  • 출력
    오른차순으로 정렬한 원소를 한줄에 하나씩 출력합니다.

  • 초록 부분이 입력 
    아래 흰 부분이 출력 입니다.

2. 풀이 과정

  • 숫자를 받아서 vector  v에 넣습니다.

  • 넣은 숫자를 문자열 타입으로 바꿔주고 STL reverse를 이용하여 문자열을 역으로 돌려줍니다.

  • 돌린 문자열을 다시 숫자 type으로(atoll) 바꿔준 후 vector rv에 넣습니다.

  • vector rv를 STL sort를 이용하여 오름차순으로 정렬한 후 출력해줍니다.

  • STL의 vector, sort, atoll, reverse를 이용하여 풀었습니다.


3. 소스 코드


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
//https://www.acmicpc.net/problem/5648
//BOJ_5648_reverse_and_sort
 
#include<iostream>
#include<cstdio>
#include<vector>
#include<cstring>
#include<string>
#include<algorithm>
using namespace std;
 
class element{
private:
    vector<long long> v;  //original 숫자들을 위한 vector
    vector<long long> rv; //reverse 숫자들을 위한 vector
    int n;
public:
    void setElement();  //vector v에 숫자를 받습니다.
    void callReverse();  //vector v의 element 를 하나씩 reverse 함수의 파라미터로 넘기고
                        // vector rv의 sort 까지해준다.
    long long rElement(long long &num); // 파라미터로 들어온 숫자를 역으로 바꾸어서 return.
    void printRV() const;   //vector rv의 element 출력.
};
 
void element::setElement(){
    scanf("%d"&n);
    for(int i=0; i<n; i++){
        long long  num;
        scanf("%lld"&num);
        v.push_back(num);
    }
}
void element::callReverse(){
    for(int i=0; i<n; i++){
        rv.push_back(rElement(v[i]));   //original의 element를 rElement에서 역으로 바꾼 후  rv에 삽입
    }
    sort(rv.begin(), rv.end()); //오름차순으로 정렬
}
 
long long element::rElement(long long &num){
    if(num == 0return 0//예외처리
    string s=to_string(num);    //original 숫자를 문자열로 만들어줍니다.
    reverse(s.begin(), s.end());    //string을 거꾸로 바꾸어 줍니다. (STL)
    return atoll(s.c_str());  //string -> long long 로 바꾸어서 push_back
}
 
void element::printRV() const{
    for(int i=0; i<n; i++){
        printf("%lld\n", rv[i]);
    }
}
 
int main(void){
    element e;
    e.setElement();
    e.callReverse();
    e.printRV();
    return 0;
}
 
cs


4. 인증



문제출처 - https://www.acmicpc.net/problem/5648

감사합니다.

반응형