평범한 필기장

[BOJ_Python] 21314_민겸 수 본문

코딩 테스트 준비/BOJ

[BOJ_Python] 21314_민겸 수

junseok-rh 2023. 3. 22. 23:32

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

 

21314번: 민겸 수

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

www.acmicpc.net

내가 생각한 풀이방식

  • 최소값을 구하는 방법 : K가 나오기 전까지 M의 개수를 카운트하고 K가 나오면 정답에 10 ** (그때까지 나온 M의 개수 - 1)을 이어 붙이고 5를 뒤에 붙여준다. 그리고 민겸 수가 K로 끝나면 앞의 방식대로 수행하고 그대로 정답을 출력하면 되지만 M으로 끝날 경우, 앞에서와 같이 정답에 10 ** (그때까지의 M의 개수 -1)을 이어붙인다.
  • 최대값을 구하는 방법 : K가 나오기 전까지 M의 개수를 카운트하고 K가 나오면 정답에 5 * (10 ** (그때까지 나온 M의 개수))를 이어 붙인다. 마지막이 K로 끝나면 앞의 방식대로 하고 정답을 출력하지만 그렇지 않은 경우 끝날 때까지의 M의 개수를 카운트하고 그 만큼의 1을 정답에 붙여준다. (저는 여기서 10 ** (M의 개수 -1)로 생각해서 틀렸습니다ㅜㅜ  MMM이면 111이 당연히 최대라는걸 생각을 못했네요.)

내 오답 코드

import sys

lst = list(map(str, sys.stdin.readline().rstrip()))
print(lst)
def lst_min(lst):
    answer = ''
    cnt = 0
    for i in lst:
        if i != 'K':
            cnt += 1
        else:
            if cnt != 0:
                answer += str(10 ** (cnt-1))
                cnt = 0
            answer += str(5)
    if cnt != 0:
        answer += str(10 ** (cnt - 1))
    return int(answer)

def lst_max(lst):
    answer = ''
    cnt = 0
    for i in lst:
        if i == 'K':
            answer += str(5 * (10 ** (cnt)))
            cnt = 0
        else:
            cnt += 1
    if cnt != 0:
        answer += str(10 ** (cnt - 1))
    return int(answer)

min = lst_min(lst)
max = lst_max(lst)
print(max)
print(min)

정답 코드

import sys

lst = list(map(str, sys.stdin.readline().rstrip()))

def lst_min(lst):
    answer = ''
    cnt = 0
    for i in lst:
        if i != 'K':
            cnt += 1
        else:
            if cnt != 0:
                answer += str(10 ** (cnt-1))
                cnt = 0
            answer += str(5)
    if cnt != 0:
        answer += str(10 ** (cnt - 1))
    return int(answer)

def lst_max(lst):
    answer = ''
    cnt = 0
    for i in lst:
        if i == 'K':
            answer += str(5 * (10 ** (cnt)))
            cnt = 0
        else:
            cnt += 1
    if cnt != 0:
        for _ in range(cnt):
            answer += '1'
    return int(answer)

min = lst_min(lst)
max = lst_max(lst)
print(max)
print(min)

다른분들의 코드를 보면 굳이 함수로 안만들고 한번에 하시던데 저는 또 따로따로 하다보니 코드도 길어지고 복잡해보이네요 ㅎㅎ

 

처음에 최대값을 구할 때, M으로 끝날 경우 M하나하나를 1로 이어붙이는걸 생각을 못해서 혼자서 뭐가 틀렸는지 찾는데 시간을 엄청썼는데 다음 번에는 좀 차분히 생각해보고 문제를 풀어봐야겠네요!!

'코딩 테스트 준비 > BOJ' 카테고리의 다른 글

[BOJ_Python] 16206_롤케이크  (0) 2023.03.24
[BOJ_Python] 1080_행렬  (0) 2023.03.23
[BOJ_Python] 20300_서강근육맨  (0) 2023.03.21
[BOJ_Python] 11508_2+1 세일  (0) 2023.03.19
[BOJ_Python] 14916_거스름돈  (0) 2023.03.18