[BOJ] 2908_상수

gogori6565·2022년 7월 23일
0
post-custom-banner

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

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

💡 입력 조건 중요
! 첫째 줄에 상근이가 칠판에 적은 두 수 A와 B가 주어진다. 두 수는 같지 않은 세 자리 수이며, 0이 포함되어 있지 않다. !


풀이
어렵지는 않은 문제인데, 풀이 방법이 많아서 각 풀이를 기록해보려한다.

풀이 1. string으로 받은 수를 거꾸로한 정수(int) 만들어 비교
풀이 2. string으로 받은 수를 맨 뒷자리부터 한 자리씩 비교
풀이 3. string으로 받은 수를 거꾸로한 string을 만들어 max() 함수로 비교
풀이 4. string으로 받은 수를 문자열을 뒤집는 reverse() 함수로 뒤집어 문자열 비교


풀이 코드
풀이 1. string으로 받은 수를 거꾸로한 정수(int) 만들어 비교

#include<iostream>
#include<string>
using namespace std;

int main(void){
    cin.tie(NULL); ios_base::sync_with_stdio(false);

    string a, b;
    int na=0, nb=0;
    cin>>a>>b;

    na+=(a[2]-'0')*100; nb+=(b[2]-'0')*100;
    na+=(a[1]-'0')*10; nb+=(b[1]-'0')*10;
    na+=(a[0]-'0'); nb+=(b[0]-'0');

    if(na>nb) cout<<na;
    else cout<<nb;

    return 0;
}

입력이 세 자리 수로 고정되어 있어서 가능한 풀이


풀이 2. string으로 받은 수를 맨 뒷자리부터 한 자리씩 비교

#include<iostream>
#include<string>
using namespace std;

int main(void){
    cin.tie(NULL); ios_base::sync_with_stdio(false);

    string a, b;
    cin>>a>>b;

    for(int i=2;i>=0;i--)
    {
        if(a[i]>b[i])
        {
            cout<<a[2]<<a[1]<<a[0];
            break;
        }
        else if(a[i]<b[i])
        {
            cout<<b[2]<<b[1]<<b[0];
            break;   
        }
    }

    return 0;
}

정수로 바꾸는 과정없이 수행할 수 있는 코드. 어차피 입력은 세 자리 수로 고정되어있고, 두 수가 같지 않으므로 맨 뒷자리 수 부터 인덱스로 접근해 문자 자체로 비교해도 되므로 큰 수를 찾아내는 방법!


풀이 3. string으로 받은 수를 거꾸로한 string을 만들어 max() 함수로 비교

#include<iostream>
#include<string>
#include<algorithm>
using namespace std;

int main(void){
    cin.tie(NULL); ios_base::sync_with_stdio(false);

    string a, b, na, nb;
    cin>>a>>b;

    for(int i=2;i>=0;i--)
    {
        na+=a[i];
        nb+=b[i];
    }

    cout<<max(na,nb);
    return 0;
}

<algorithm> 헤더 파일에 들어있는 max() 함수!

  • max(num1, num2) 중에 더 큰 수(max)를 반환
  • min(num1, num2) 중에 더 작은 수(min)를 반환

+) 사실 max() 안쓰고 그냥 na>nb 비교해도 된다. (string에 비교 연산자를 쓰면 사전적 순서에 따라 크기를 비교한다)

na+=a[i]; nb+=b[i];

  • 문자열로 저장하므로 하나씩 집어넣으면 순서대로 기입됨

풀이 4. string으로 받은 수를 문자열을 뒤집는 reverse() 함수로 뒤집어 문자열 비교

#include<iostream>
#include<string>
#include<algorithm>
using namespace std;

int main(void){
    cin.tie(NULL); ios_base::sync_with_stdio(false);

    string a, b, na, nb;
    cin>>a>>b;

    reverse(a.begin(), a.end());
    reverse(b.begin(), b.end());

    if(a>b) cout<<a;
    else cout<<b;

    return 0;
}

reverse() 에 대해서 다음 글에 자세히 포스팅하겠다. 참고로 헤더는 <algorithm>


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

profile
p(´∇`)q
post-custom-banner

0개의 댓글