백준 21314 자바

손찬호·2024년 4월 23일
0

알고리즘

목록 보기
26/91

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

풀이 아이디어

최대값인 문자열을 MaxSb, 최소값인 문자열을 MinSB라고 할 때,
최대값은 입력값에서 K까지의 M의 갯수를 세고 변환해주고,
K없이 M만 연속될 때는 M을 숫자만큼 1을 더해주면 된다.

최소값은 K는 무조건 단일로 변환해서 5로 바꾸고, M끼리는 묶어서 변환해주면 된다.

트러블 슈팅

1. 큰 수 처리

처음에 제곱수를 숫자로 계산하고 문자열로 변환해서 더해주면서 최대값, 최솟값을 구하려고 했다.
MaxSb.append(Integer.toString((int)(Math.pow(10,mCount))));

하지만 입력값을 보면 민겸 수는 대문자 M과 K로만 이루어진 문자열이며, 길이는 3,000을 넘지 않는다.
문자열이 3000자가 넘는 경우 10300010^{3000}인 경우 int보다 더 큰 정수형인 long으로도 다 담지 못해서
NumberFormat Error가 발생했다.

그래서 아예 문자열만 더해주는 방식으로 변경해서 해결했다.
MaxSb.append("5").append("0".repeat(mCount));

2. 마지막이 M으로 끝나는 경우의 최대값

입력:
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());
    }
}
profile
매일 1%씩 성장하려는 주니어 개발자입니다.

0개의 댓글

관련 채용 정보