알고리즘/백준

[백준/c++] 21314번: 민겸 수

녕이 2022. 7. 13. 16:33
728x90

 

 

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

 

21314번: 민겸 수

민겸 수 하나가 주어진다. 민겸 수는 대문자 M과 K로만 이루어진 문자열이며, 길이는 3,000을 넘지 않는다.

www.acmicpc.net

 

헷갈리는 문제였는데,,, 4번은 틀렸다ㅋㅋ...

최댓값과 최솟값을 따로 구해주었는데, 

 

최댓값은 뒤에 K가 붙으면 *5가 되는데(뒤에 K는 1개만 붙을 수 있음)

M의 개수를 구하고 다음 원소가 K라면 5가 붙고 M의 개수만큼 뒤에 0을 붙인다.

현재 원소가 K라면 5만 붙인다. (모두 M이라면 1로만 구성된다)

 

최솟값은 K를 하나로 자르고, M은 최대한 길게 자른다(K 없이)

M의 개수를 구하고 M-1개만큼 0을 붙인다. (11보다 10이 더 작으므로)

현재 원소가 K라면 5를 붙인다.

 

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

int main(){
    ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    string s, maxv = "", minv = "";
    cin >> s;
    
    //max value
    for(int i=0; i<s.size(); i++){
        if(s[i] == 'M'){ //M의 경우
            //연속 M 개수 카운팅
            int end = i;
            while(end < s.size()){
                if(s[end] == 'M') end++;
                else              break;
            }
            
            //10진수로 변환
            if(end == s.size()){ //모두 M인 경우
                for(int j=0; j<end-i; j++){
                    maxv += "1";
                }
            }else{ //다음 원소가 K인 경우
                maxv += "5";
                for(int j=0; j<end-i; j++){ //M의 개수만큼 0붙음
                    maxv += "0";
                }
            }
            i = end;
        }else{ //K의 경우
            maxv += "5";
        }
    }
    
    //min value - k를 하나로 자르기, M은 최대한 길게(K없이)
    for(int i=0; i<s.size(); i++){
        if(s[i] == 'M'){
            int end = i;
            while(end < s.size()){
                if(s[end] == 'M') end++;
                else              break;
            }
            
            //10진수로 변환
            minv += '1';
            end--;
            for(int j=0; j<end-i; j++){ //M-1개만큼 0 붙이기
                minv += '0';
            }
            i = end;
        }else{
            minv += '5';
        }
    }
    cout << maxv << '\n' << minv << '\n';
    return 0;
}

 

 

 

 

 

728x90