문제 링크: 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();
    }
}