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
'알고리즘 > 백준' 카테고리의 다른 글
[백준/c++] 2422번: 한윤정이 이탈리아에 가서 아이스크림을 사먹는데 (0) | 2022.07.14 |
---|---|
[백준/c++] 19532번: 수학은 비대면강의입니다 (0) | 2022.07.13 |
[백준/c++] 20365번: 블로그2 (0) | 2022.07.13 |
[백준/c++] 1541번: 잃어버린 괄호 (0) | 2022.07.13 |
[백준/c++] 1931번: 회의실 배정 (0) | 2022.07.12 |