[백준 2908] 상수

백준 2908번 - 상수

백준 2908번

❓ 문제

상근이의 동생 상수는 수학을 정말 못한다. 상수는 숫자를 읽는데 문제가 있다. 이렇게 수학을 못하는 상수를 위해서 상근이는 수의 크기를 비교하는 문제를 내주었다. 상근이는 세 자리 수 두 개를 칠판에 써주었다. 그 다음에 크기가 큰 수를 말해보라고 했다.

상수는 수를 다른 사람과 다르게 거꾸로 읽는다. 예를 들어, 734와 893을 칠판에 적었다면, 상수는 이 수를 437과 398로 읽는다. 따라서, 상수는 두 수중 큰 수인 437을 큰 수라고 말할 것이다.

두 수가 주어졌을 때, 상수의 대답을 출력하는 프로그램을 작성하시오.


✏️ 풀이

이 문제는 상근이 동생 상수의 이야기이다.
상수는 수학을 못하기 때문에, 숫자 두개를 주면, 그 숫자를 뒤집어서 대소 판정을 한다.
따라서, 우리는 상수가 말하는 큰 숫자를 찾아야 한다.
상수 바보 녀석ㅋ

무조건 세 자리 수라는 조건이 있다.

나는 이 문제를 이렇게 접근하였다.

  1. input을 string으로 받는다. (혹은 int로 받고 to_string으로 바꿈)
  2. vector<char>을 두 개 선언 해준다.(reverse를 하기 위함)
  3. string 각 index에 -48 처리를 해주어 vector에 push한다.
  4. algorithm 라이브러리의 reverse를 사용하여 vector를 뒤집어준다.
  5. 그 후, vector 전체를 string으로 바꾼다.
  6. stoi를 이용하여 int로 뽑고 대소 판정을 한다.

더 간결히 짤 수 있을텐데 약간 복잡하게 짠 것 같다..
아래는 정답 코드이다.


✔️ 정답 코드

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

using namespace std;

vector<char> vec_A;
vector<char> vec_B;

int init_num (string temp, bool check);

int main(void) {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);

  string A, B;

  cin >> A >> B;

  int a = init_num(A, true);
  int b = init_num(B, false);

  a > b ? cout << a : cout << b;
  
  return 0;
}

int init_num (string temp, bool check) {
  for (int i=0; i<temp.length(); i++) {
    check ? vec_A.push_back(temp[i])
      : vec_B.push_back(temp[i]);
  }
  
  check ? reverse(vec_A.begin(), vec_A.end())
    : reverse(vec_B.begin(), vec_B.end());

  string reverse_temp;
  check ? reverse_temp=string(vec_A.begin(), vec_A.end())
    : reverse_temp=string(vec_B.begin(), vec_B.end());
  
  return stoi(reverse_temp);
}

Leave a comment