관리 메뉴

cococo-coding

[C++ 풀이] 2864번. 5와 6의 차이 본문

[BOJ] 코드 모음/C++_알고리즘

[C++ 풀이] 2864번. 5와 6의 차이

_dani 2024. 1. 28. 19:20

 

문제 분석

두 정수 a,b를 받아서 5와 6 숫자들을 변경하여 두 수의 최댓값을 구하는 문제이다.

모든 수가 6일때의 합이 최댓값이 되고, 모든 수가 5일때의 합이 최솟값이 된다. 

 

알고리즘 설계

a와 b를 string으로 받는다. 5와 6을 치환해야하는 부분이 있기 때문!

만약 각 인자의 '5'가 있으면 '6'으로 치환해서 max값을 구해준다.

이때 stoi함수로 a와b를 각각 int형으로 변경해준뒤에 max를 구해준다.

min도 동일하게 구해준다. 

stoi함수는 괄호안에 바꿀 string을 넣어줘야한다. 

int max = stoi(a) + stoi(b);

 

코드

#include <iostream>
#include <string>
using namespace std;
/*
1. 정수 a,b를 받는다.
2. 정수 중 5와 6을 찾는다.
3. 5와 6을 바꾼 a2, b2를 생성한다.
4. 두수의 합 중 최솟값과 최댓값을 찾는다
5. 4를 출력한다.
*/
int main() {
    //1
    string a, b;
    cin >> a >> b;

    //2-1 두 수의 합의 최댓값 구하기
    for (int i = 0; i < a.size(); i++) 
        if (a[i] == '5') a[i] = '6';
    for (int i = 0; i < b.size(); i++)
        if (b[i] == '5') b[i] = '6';
    int max = stoi(a) + stoi(b);  

    //2-2두 수의 합의 최솟값 구하기
    for (int i = 0; i < a.size(); i++)
        if (a[i] == '6') a[i] = '5';
    for (int i = 0; i < b.size(); i++)
        if (b[i] == '6') b[i] = '5';
    int min = stoi(a) + stoi(b);
    cout << min << ' ' << max;

    return 0;
}

 

노트

우선 처음에는 각 수 a,b마다 5나 6이 하나만 있다고 생각하고 접근했다.

그래서 a,b를 복제한 a2, b2를 생성하고 이 a2,b2의 인자만 바꾸면 된다고 코드를 짰다. 

그래서 각 for문으로 a[i]==5면 a2[i]에 6을 넣는 식으로 새로운 수를 만들었는데 

생각해보니 하나의 수에 여러개의 5와 6이 있을 수도 있다.... 

 

그래서 다시 생각을 했는데 

a2의 벡터와 b2의 벡터 배열을 만들어서 for문으로 돌리면서 a2의 인자를 바꾼 것을 벡터에 넣고

a2에 다시 a를 넣어 for문으로 돌리는 식으로 코드를 짜려고 했다. 

그런데 이것도 문제인데, 15768이런식이면

앞에 5가 5랑 6일때, 뒤의 6이 5랑 6일때 이런식으로 각 케이스가 2개씩이니

2 x 2 해서 총 4가지 케이스가 나오는 것이다.

이거를 일일히 벡터배열에 넣어서 하기에는 너무 복잡해지니 어떻게 해야할지 감이 안 잡혔다. 

 

구글링을 해본 결과 

어차피 두 수의 합의 최댓값과 최솟값만 구하면 되니

모든 수가 5일 때를 최솟값으로

모든 수가 6일 때를 최댓값으로 

이렇게만 구하면 된다는 것을 깨달았다.