[Python] 백준 #21314- 민겸 수

2023. 9. 1. 18:05·코딩테스트/백준[Python]

문제


 

 

21314번: 민겸 수

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

www.acmicpc.net

코드


My answer

import sys
input=sys.stdin.readline

a=input()[:-1]
temp=[]

max_n=''
min_n=a.split('K')

for i in range(len(a)):
    if(a[i]=='M'):temp.append(a[i])
    else:
        if(temp==[]):max_n+='5'
        else:
            max_n=max_n+'5'+('0'*(len(temp)))
            temp=[]
if(temp!=[]):max_n=max_n+('1'*len(temp))

for i in range(len(min_n)):
    if(min_n[i]!=''):
        min_n[i]='1'+('0'*(len(min_n[i])-1))
min_n='5'.join(min_n)

print(max_n)
print(min_n)

Another answer

data = input()
max = "" #최댓값 결과
min = "" #최솟값 결과
m = 0

for i in range(len(data)):
    if data[i] == 'M':
        m += 1 #M이 나온다면 m을 증가
    elif data[i] == 'K':
        if m: #M후에 K가 연속해서 나온 경우라면
            min += str(10**m + 5) #최솟값의 경우 5를 더해주고
            max += str(5 * (10**m)) #최댓값의 경우 5를 곱해준다
        else: #만일 K만 두번이상 연속된 경우
            min += "5" 
            max += "5"
        m = 0
if m: #'K'없이 'M'들로 문자열이 끝난 경우
    min += str(10 ** (m-1))
    while m:
        max += "1"
        m -= 1
print(max)
print(min)

풀이


우선 문제 이해하는게 좀 헷갈려서 오래 걸렸다. 나는 최대값과 최소값을 나누어서 구하였다. 

[최대값]

우선 M=1, MK=50, MMK=500 이런식으로 M과K를 끊어서 MK=50 / M,K=1,5 이므로 MK는 붙어야 더 숫자가 커진다.

따라서 전체 문자열을 훑으면서 M이면 그냥 리스트에 넣고, K를 만나면 리스트 안에있던 5+리스트안에 있던 M의갯수만큼 넣어주면 된다. 즉 MMMK 이면 리스트에 MMM이 들어가있고 K를 만나면 5에다가 0을 3개 붙여서 MMMK=5000이 된다.

이런식으로 넣어주고 잊지말아야할 점은 마지막에 K가 안나와 예를들어 ...MMM이런식으로 끝날 때는 M을 전부 1로 바꿔서 111로 바꾸면 된다. M을 전부 붙여서 MMM을 하나로보면 100이 되기 떄문에 M,M,M으로 끊어서 111로 만드는게 중요하다. 즉 MKMMM일시에는 MK를 50으로 바꾸고, MMM을 111로 바꿔 50111이 된다.

[최소값]

최소값은 간단했는데 그냥 모든 K는 M과 합쳐지지 않게 그냥 5로 바꾸면 된다. M과K가 합쳐지는순간 숫자가 커지기 때문에 K로 SPLIT하고 M은 최대한 붙여서 전부 숫자로 바꿔주면 된다. M도 끊어주면 1로바뀌기 떄문에, 즉 MKKMMK이면 M=1, KK=55,MM=10,K=5 이런식.

 

다른 풀이의 경우 한번만 돌려서 푼 경우인데, 이 경우도 참고하면 좋을 것 같다. 

다른 풀이 해설

최댓값을 구하기 위해서는 최대한 M과 K로 구성된 숫자를 많이 만들어야 하고

최솟값을 구하기 위해서는 MK가 같이 포함된 숫자를 만들면 안된다.

M과 K로 구성된 숫자는 10을 (M의 개수) 만큼 거듭제곱해주고 5를 곱해준다

ex) MK -> (10^1) * 5 = 50

M과 K가 연속되었는데 둘이 같은 숫자가 아니라면 10을 (M의 개수) 만큼 거듭제곱 해주고 5를 더해준다 

ex) M K -> (10^1) + 5 = 15

 

추가 테스트 케이스

입력 : 
KMKMM

정답 :
55011
51510

728x90

'코딩테스트 > 백준[Python]' 카테고리의 다른 글

[Python] 백준 #2979 - 트럭 주차  (0) 2023.09.02
[Python] 백준 #11501- 주식  (0) 2023.09.01
[Python] 백준 #20365- 블로그 2  (0) 2023.09.01
[Python] 백준 #1541- 잃어버린 괄호  (0) 2023.09.01
[Python] 백준 #19941 - 햄버거 분배  (0) 2023.08.24
'코딩테스트/백준[Python]' 카테고리의 다른 글
  • [Python] 백준 #2979 - 트럭 주차
  • [Python] 백준 #11501- 주식
  • [Python] 백준 #20365- 블로그 2
  • [Python] 백준 #1541- 잃어버린 괄호
창빵맨
창빵맨
  • 창빵맨
    Let's be Developers
    창빵맨
    로그인/로그아웃
  • 전체
    오늘
    어제
    • 분류 전체보기 (471)
      • 알쓸신잡 (79)
      • ML & DL (85)
        • Computer v.. (22)
        • NLP (22)
        • 파이썬 머신러닝 완.. (3)
        • 개념정리 (38)
      • 리눅스 (21)
      • 프로젝트 (29)
        • 산불 발생 예측 (6)
        • 음성비서 (12)
        • pdf 병합 프로그.. (0)
        • 수위 예측 (5)
        • 가짜 뉴스 분류 (5)
        • 전력사용량 예측 (1)
      • 코딩테스트 (217)
        • 프로그래머스[Pyt.. (17)
        • 프로그래머스[Fai.. (3)
        • 백준[Python] (160)
        • 이것이취업을위한코딩.. (18)
        • 파이썬 알고리즘 (19)
      • 데이터분석실습 (25)
        • 데이터 과학 기반의.. (18)
        • 헬로 데이터 과학 (7)
      • 메모장 (0)
      • 잡담 (4)
  • Personal

    GITHUB
    Instagram
  • 공지사항

  • 인기 글

  • 태그

    이코테
    백준
    BFS
    그리디
    파이썬
    이분탐색
    나동빈
    DFS
    dp
    이것이취업을위한코딩테스트다
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3

HOME

HOME

상단으로

티스토리툴바