백준/lv.3

[lv3] 21314. 민겸 수(Python 파이썬 풀이)

MakeMoneying 2021. 8. 16. 21:54

출처

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

 

21314번: 민겸 수

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

www.acmicpc.net

결과

문제

민겸이는 로마 숫자를 보고 굉장히 흥미롭다고 생각했다. 그래서 민겸이는 새로운 수 체계인 민겸 수를 창조했다.

민겸 숫자는 0 이상의 정수 N에 대해 10N 또는 5 × 10N 꼴의 십진수를 대문자 M과 K로 이루어진 문자열로 표기한다. 10N 꼴의 십진수는 N + 1개의 M으로, 5 × 10N 꼴의 십진수는 N개의 M 뒤에 1개의 K를 이어붙인 문자열로 나타낸다. 즉, 아래 표처럼 나타낼 수 있다.

변환 전 변환 후
1 M
5 K
10 MM
50 MK
100 MMM
500 MMK
1000 MMMM
5000 MMMK
... ...

민겸 수는 한 개 이상의 민겸 숫자를 이어붙여 만든다. 예를 들어, 민겸 수 MKKMMK는 MK, K, MMK의 세 민겸 숫자를 이어붙여 만들 수 있다.

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

민겸이는 위와 같이 하나의 민겸 수가 다양한 십진수로 변환될 수 있다는 사실을 알았다. 문득 민겸이는 변환될 수 있는 십진수 중 가장 큰 값과 가장 작은 값이 궁금해졌다. 민겸이를 위해 하나의 민겸 수가 십진수로 변환되었을 때 가질 수 있는 최댓값과 최솟값을 구해주자.

입력

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

출력

주어진 민겸 수가 십진수로 변환되었을 때 가질 수 있는 값 중 가장 큰 값과 가장 작은 값을 두 줄로 나누어 출력한다.

예제 입력 1

MKM

예제 출력 1

501
151

예제 입력 2

MKKMMK

예제 출력 2

505500
155105

해석

K가 나올 때 어떻게 해석을 하느냐에 따라 결과가 달라진다. 일단 K하나만 주어진다면 최솟값과 최댓값은 모두 5이다.
MK에 대해선 최솟값이 15이고, 최댓값은 50이 된다. MMK에 대해선 최솟값이 105이고, 최댓값이 500이다. 마지막으로 MMKMM에 대해선 최솟값이 10510이며 최댓값은 50011이 된다. 이제 규칙이 보일 것이다.

  • 최솟값의 규칙은 K가 나올 때마다 10 ^ ( K가 나오기 전의 M의 개수) + 5를 추가해주고, 마지막에 K가 나오지 않았다면 10 ^ (M의 개수)를 추가해주면 된다.
  • 최댓값의 규칙은 K가 나올 때 마다 10 ^ ( K가 나오기 전의 M의 개수) * 5를 추가해주고, 마지막에 K가 나오지 않았다면 남은 M의 개수만큼 1을 추가하면 된다.

소스 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import sys
 
= sys.stdin.readline().strip()
Max = Min = ""
= 0
for i in range(len(w)):
    if w[i] == "M":
        m += 1
    elif w[i] == "K":
        if m:
            Min += str(10 ** m + 5)
            Max += str(5 * (10 ** m ))
        else:
            Min += "5"
            Max += "5"
        m = 0
if m:
    Min += str(10 ** (m - 1))
    while m:
        Max += "1"
        m -= 1
print(Max)
print(Min)
cs