하루하루 꾸준히, 인생은 되는대로

알고리즘

백준 5648 역원소 정렬 C++/STOI함수

긤효중 2022. 7. 24. 22:31

https://www.acmicpc.net/problem/5648

 

5648번: 역원소 정렬

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

www.acmicpc.net


문제

모든 원소가 양의 정수인 집합이 있을 때, 원소를 거꾸로 뒤집고 그 원소를 오름차순으로 정렬하는 프로그램을 작성하세요.

단, 원소를 뒤집었을 때 0이 앞에 선행되는 경우는 0을 생략해야합니다.


입력

첫 번째로 입력되는 건 n (1 ≤ n ≤ 106)으로 사용자가 뒤이어 입력할 원소값을 결정합니다. 입력하는 줄에는 하나의 원소값 뿐만 아니라 여러 원소값도 들어갈 수 있습니다.

단, 입력하는 정수는 1012을 넘어선 안 됩니다.


std::stoi, std::stol, std::stoll

int stoi(const std::string& str, std::size_t* pos = 0, int base = 10);
int stoi(const std::wstring& str, std::size_t* pos = 0, int base = 10);
// stol 함수
long stol(const std::string& str, std::size_t* pos = 0, int base = 10);
long stol(const std::wstring& str, std::size_t* pos = 0, int base = 10);
// stoll 함수
long long stoll(const std::string& str, std::size_t* pos = 0, int base = 10);
long long stoll(const std::wstring& str, std::size_t* pos = 0, int base = 10);

stoi,stol,stoll모두 문자열 혹은 wstring의 문자열 str을 base진법을 사용하는 부호 있는 정수로 바꿔준다.

문자열을 정수로 해석할 떄 , 다음의 과정을 거친다.

 

먼저 , 맨 앞에 붙어 있는 공백 문자들을 공백문자가 나올 떄까지 무시한다.

isspace()시 TRUE인 값이 공백문자인데, 공백문자들은 다음과 같다.

1. " "     = 공백(=스페이스)
2. "\n" = 개행
3. "\t"  = 수평 탭
4. "\v"  = 수직 탭
5. "\f"  = 피드
6. "\r"  = 캐리지 리턴

출처: https://blockdmask.tistory.com/449 [개발자 지망생:티스토리]

 

그 후, 입력받은 문자열이 base진법으로 써진 것이라고 가정하고 읽는다.

base진법으로 가능한 것은 0,2,3, ..., 36 까지이다.

base가 2라면, 0과 1만 올 수 있고, base가 3이면 0,1,2만 올 수 있다.

base가 0이라면 다음과 같은 경우가 발생한다. 0(8진수), 0X(16진수)

->

 

맨 앞의 문자가 0 이면 8 진법으로, 0x 이면 16 진법으로, 그 외의 경우 그냥 10 진법 수로 생각된다.

base생략 시 기본적으로 10진법이다.

 

문제에서 원소를 뒤집었을떄, "00000123"이런 경우가 있을 텐데 '0'이 공백 문자인지 확인을 해야했다.

isspace('0')호출시 0을 출력하므로, 공백문자이고, stoi,stol,stoll호출시 공백문자 '0'은 무시됨을 확인할 수 있었다.

#include <iostream>
#include <algorithm>
#include <string>
#include <vector>

typedef long long ll;
using namespace std;
int main(void){
    int n;
    cin >> n;
    vector<ll> v;
    for(int i = 0;i<n;i++){
        string str;
        cin >> str;
        reverse(str.begin(),str.end());
        ll temp = stoll(str);
        v.push_back(temp);
    }
    
    sort(v.begin(),v.end());
    for(int i = 0;i<v.size();i++){
        cout << v[i] << '\n';
    }
}

'알고리즘' 카테고리의 다른 글

백준 14912 숫자 빈도수 C++  (0) 2022.07.28
백준 2660 회장뽑기 C++  (0) 2022.07.28
백준 12919 A와 B 2  (0) 2022.07.24
백준 11292 키 큰 사람 C++  (0) 2022.07.22
백준 12933 오리 C++  (0) 2022.07.22