Post
민겸 수(백준 21314번) | Gihun Son

민겸 수(백준 21314번)

💡 **Check Point !

( 해당사항 ✓체크 )

  1. 막힘 없이 수월하게 풀린 문제인가?

  2. 1시간이내로 풀렸던 문제인가?✓

  3. 1시간 이상 or 며칠을 두고 풀어봤더니 풀린 문제인가?

  4. 시간을 써도 도무지 풀 수 없는 문제인가?

  5. 솔루션을 찾아봤는가?


난이도 체감

  1. 최상

  2. 중✓


이해도

  1. 완벽히 이해✓

  2. 다소 헷갈리는 부분들이 있음

  3. 이해 못함

문제

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

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

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

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

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

https://upload.acmicpc.net/3a65029c-5253-4600-8d93-908e4f368161/-/preview/

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

Untitled

나의 풀이

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
from collections import deque

n_word=deque(list(input()))

if 'K' in n_word:
    answer=''
    n_word1=n_word.copy()
    n_word2=n_word.copy()
    while n_word1:
        tmp_list=[]
        while n_word1 and n_word1[0]!='K':
            tmp_list.append(n_word1.popleft())
        if n_word1:
            tmp_list.append(n_word1.popleft())
            answer=answer+'5'+'0'*(len(tmp_list)-1)
        else:
            answer=answer+'1'*len(tmp_list)
    print(answer)
    answer=''
    while n_word2:
        tmp_list=[]
        while n_word2 and n_word2[0]!='K':
            tmp_list.append(n_word2.popleft())
        if len(tmp_list)==1:
            answer=answer+'1'
        elif tmp_list:
            answer=answer+str(10**(len(tmp_list)-1))
        while n_word2 and n_word2[0]=='K':
            tmp_list.append(n_word2.popleft())
            answer=answer+'5'
    print(answer)
else:
    print('1'*len(n_word))
    if len(n_word)==1:
        print('1')
    else:
        print(10**(len(n_word)-1))
  • 이번 문제는 오류가 많이 발생했다.
  • 조건을 따질 때, M이 1개만 나올 때, K가 없어서 tmp_list에 아무것도 존재하지 않을 때 등, 다양한 예외 처리를 누락했다. 도저히 백준 문제 풀이만으로는 찾을 수 없어서, vscode로 디버깅해서 해당 오류들을 찾아내었다.
This post is licensed under CC BY 4.0 by the author.