문제 링크: https://www.acmicpc.net/problem/21314

 

21314번: 민겸 수

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

www.acmicpc.net

 

문제

풀이

가장 큰 수의 조건

  1. M이 K를 만날 때까지 상태를 유지하는 것이다. ( ex = MMK -> 500, MMMK->5000 )
  2. M이 연속 될 시 1로 상태 변환한다. ( ex = MMM-> 111, MM-> 11 )

가장 작은 수의 조건

  1. K는 바로 5로 상태 변환한다. ( ex = MMK -> 105, KK -> 55 )
  2. M은 연속 될 시 제곱의 형태로 변환한다. ( ex = MMMK -> 1005, MMMM-> 1000 )

위의 조건들을 만족시키는 코드를 완성하면 된다. ( 단 글자의 수가 3000개이므로 long, int로 받기는 불가능하다 String을 이용 해야한다.)

 

import java.math.BigInteger;
import java.util.*;
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String s = br.readLine();
int size = s.length();
System.out.println(findMax(s, size, 0));
System.out.println(findMin(s, size, 0));
}
private static String findMin(String str, int size, int k) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < size; i++) {
if (str.charAt(i) == 'M') {
k = i;
while (k < str.length() && str.charAt(k) == 'M') {
k++;
}
sb.append(1);
for(;i+1<k; i++){
sb.append(0);
}
i = k - 1;
} else {
sb.append(5);
}
}
return sb.toString();
}
private static String findMax(String str, int size, int k) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < size; i++) {
if (str.charAt(i) == 'M') {
k = i;
while(k<size && str.charAt(k)=='M'){
k++;
}
if(k==size){
for(;i<k; i++){
sb.append(1);
}
}
else{
sb.append(5);
for(;i<k; i++){
sb.append(0);
}
}
i=k;
} else {
sb.append(5);
}
}
return sb.toString();
}
}