민겸이는 로마 숫자를 보고 굉장히 흥미롭다고 생각했다. 그래서 민겸이는 새로운 수 체계인 민겸 수를 창조했다.
민겸 숫자는 0 이상의 정수 N에 대해 10N 또는 5 × 10N 꼴의 십진수를 대문자 M과 K로 이루어진 문자열로 표기한다. 10N 꼴의 십진수는 N + 1개의 M으로, 5 × 10N 꼴의 십진수는 N개의 M 뒤에 1개의 K를 이어붙인 문자열로 나타낸다. 즉, 아래 표처럼 나타낼 수 있다.

민겸 수는 한 개 이상의 민겸 숫자를 이어붙여 만든다. 예를 들어, 민겸 수 MKKMMK는 MK, K, MMK의 세 민겸 숫자를 이어붙여 만들 수 있다.
민겸 수를 십진수로 변환할 때는, 1개 이상의 민겸 숫자로 문자열을 분리한 뒤, 각각의 민겸 숫자를 십진수로 변환해서 순서대로 이어붙이면 된다. 민겸 숫자를 십진수로 변환하는 것은 십진수를 민겸 숫자로 변환하는 과정을 거꾸로 하면 된다. 예를 들어, 민겸 수 MKKMMK는 아래 그림과 같이 여러 가지 십진수로 변환할 수 있다.

민겸이는 위와 같이 하나의 민겸 수가 다양한 십진수로 변환될 수 있다는 사실을 알았다. 문득 민겸이는 변환될 수 있는 십진수 중 가장 큰 값과 가장 작은 값이 궁금해졌다. 민겸이를 위해 하나의 민겸 수가 십진수로 변환되었을 때 가질 수 있는 최댓값과 최솟값을 구해주자.
민겸 수 하나가 주어진다. 민겸 수는 대문자 M과 K로만 이루어진 문자열이며, 길이는 3,000을 넘지 않는다.
주어진 민겸 수가 십진수로 변환되었을 때 가질 수 있는 값 중 가장 큰 값과 가장 작은 값을 두 줄로 나누어 출력한다.
MKM
501
151
가장 큰 수가 나오기 위해서는 다음 규칙을 따른다.
1. K 앞에 연속된 M이 있을 경우 붙여준다. (ex) "MMK" -> "MMK") "M","M","K"로 둘 경우 115지만 하나로 생각할 경우 500이 되기 때문이다.
2. 뒤에 K가 붙지 않으면서 연속된 M이 있을 경우, M을 각각으로 생각한다. (ex) "MM" -> "M", "M") 각각 생각할 경우 11이고 하나로 둘 경우 10이기 때문이다.
가장 작은 수가 나오기 위해서는 다음 규칙을 따른다.
1. K 앞에 연속된 M이 있을 경우 분리한다. (ex) "MMK" -> "MM", K") "MM","K"로 둘 경우 105지만 붙여줄 경우 500이 되기 때문이다.
2. 뒤에 K가 붙지 않으면서 연속된 M이 있을 경우, M을 붙여준다. (ex) "MM" -> "MM") 각각 생각할 경우 11이고 하나로 둘 경우 10이기 때문이다.
이를 규칙으로 getMax, getMin 함수를 구현해주면 된다. 둘의 구현 방식은 거의 동일하므로 getMax에 대해서만 정리한다.
1. minkyeom[i]가 "M"일 경우 count를 1 증가시켜준다. (count는 연속된 M의 개수이다)
2. minkyeom[i]가 "K"일 경우 count가 1 이상이라면 count 개수만큼 5뒤에 0을 붙여준다. count가 0이라면 5만 추가한다.
3. 마지막이 "M"으로 끝날 수 있기 때문에 모두 검사했을 때 count가 1 이상이라면 1을 count만큼 추가해준다.
var fs = require('fs');
let minkyeom = fs.readFileSync(0, 'utf-8').toString().trim();
let min = '';
let max = '';
function getMax() {
let count = 0;
for (let i = 0; i < minkyeom.length; i++) {
if (minkyeom[i] === 'M') {
count++;
} else {
if (count > 0) {
max += '5' + '0'.repeat(count);
} else {
max += '5';
}
count = 0;
}
}
if (count > 0) {
max += '1'.repeat(count);
}
}
function getMin() {
let count = 0;
for (let i = 0; i < minkyeom.length; i++) {
if (minkyeom[i] === 'M') {
count++;
} else {
if (count > 0) {
min += '1' + '0'.repeat(count - 1);
}
min += '5';
count = 0;
}
}
if (count > 0) {
min += '1' + '0'.repeat(count - 1);
}
}
getMax();
getMin();
console.log(max);
console.log(min);
모든 경우를 다 생각해봐야 할 것 같아서 DFS로 접근했는데 원하는 결과가 나오지 않아서 풀이를 참고했다. 참고한 내용으로 구현했을 때 바보 같이 padStart로 구현해서 오류난 문제....