https://www.acmicpc.net/problem/21314
최대값인 문자열을 MaxSb, 최소값인 문자열을 MinSB라고 할 때,
최대값은 입력값에서 K까지의 M의 갯수를 세고 변환해주고,
K없이 M만 연속될 때는 M을 숫자만큼 1을 더해주면 된다.
최소값은 K는 무조건 단일로 변환해서 5로 바꾸고, M끼리는 묶어서 변환해주면 된다.
처음에 제곱수를 숫자로 계산하고 문자열로 변환해서 더해주면서 최대값, 최솟값을 구하려고 했다.
MaxSb.append(Integer.toString((int)(Math.pow(10,mCount))));
하지만 입력값을 보면 민겸 수는 대문자 M과 K로만 이루어진 문자열이며, 길이는 3,000을 넘지 않는다.
문자열이 3000자가 넘는 경우 인 경우 int보다 더 큰 정수형인 long으로도 다 담지 못해서
NumberFormat Error가 발생했다.
그래서 아예 문자열만 더해주는 방식으로 변경해서 해결했다.
MaxSb.append("5").append("0".repeat(mCount));
입력:
MKMM
출력:
5011
1510
이게 올바른 예시인데 마지막이 M으로 끝나는 경우의 최대값은
MM을 11로 변환해줘야 하는데 실수로 10으로 처리를 해버렸다.
그래서 while문을 사용해 연속된 M의 길이를 세주고 다음에 K가 나오면 5+0*(M갯수)
M이 나오면 M갯수만큼 "1"을 더해주는 방식으로 바꿔 해결했다.
문제에 제시된 테스트 케이스를 제외한 2가지 케이스를 추가로 만들어서 계산해보았다.
입력:
MMMMMMMMMMMKKKKKKKKKKK
출력:
5000000000005555555555
1000000000055555555555
입력:
MKMM
출력:
5011
1510
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String inputString = br.readLine();
// 최대값은 K까지 자르면 된다.
StringBuffer MaxSb = new StringBuffer();
int mCount = 0;
for (int i=0; i<inputString.length(); i++){
while(i<inputString.length() && inputString.charAt(i) == 'M'){
mCount++;
i++;
}
if(i<inputString.length() && inputString.charAt(i) == 'K'){
MaxSb.append("5").append("0".repeat(mCount));
mCount = 0;
}
else{
MaxSb.append("1".repeat(mCount));
mCount = 0;
}
}
System.out.println(MaxSb.toString());
// 최소값은 M은 붙이고, K는 붙이지 않기.
StringBuffer MinSb = new StringBuffer();
mCount = 0;
for (int i=0; i<inputString.length(); i++){
if (inputString.charAt(i) == 'M'){
// M->M
if(i!=inputString.length()-1 && inputString.charAt(i+1) == 'M'){
mCount++;
}
// M->K
else if(i!=inputString.length()-1 && inputString.charAt(i+1) == 'K'){
// 10^mCount
MinSb.append("1").append("0".repeat(mCount));
mCount = 0;
}
// M이 마지막인 경우
else{
// 10^mCount
MinSb.append("1").append("0".repeat(mCount));
mCount = 0;
}
}
else if (inputString.charAt(i) == 'K'){
MinSb.append("5");
}
}
System.out.println(MinSb.toString());
}
}