白俊答題21314民謙洙

7589 ワード

boj 21314:民謙洙
質問アドレス:https://www.acmicpc.net/problem/21314
難易度:silver 1
1.問題の説明
  • 民兼守が存在する.
  • ルールは、民謙数が与えられたときに最大値、最小値を求めることです.
  • 2.問題を解決する考え.
  • 最大値、最小値作成時ルックアップルール
  • の最大値を作るには、まずMを最大化し、それからK、
  • を加えます.
  • の最小値を作成するには、MとKは加算できません.
  • 3.問題の処理方法
    for n in num: #문자열의 문자 하나하나를 순회하며
        if n == 'M': #문자가 M이면 카운트를 증가시킨다.(M이 나왔는지, 나왔으면 몇개나왔는지 기록위함)
            cnt += 1
        else: #K가 나왔을 때
            if cnt > 0: #M이 한번이라도 나왔다면
                min += str((10 ** cnt)+5) #최소값을 만들기 위해선 M따로 K따로 해서 15를 만들어야함
                max += str(5 * (10 ** cnt)) #최대값을 만들기 위해선 M만큼 0을 붙히고 5를 곱해야함
            else: #M이 안나왔으면 그냥 둘다 5로 처리해줌
                min += '5'
                max += '5'
            cnt = 0
    #마지막이 M으로 끝났을 때
    if cnt > 0:
        min += str(10 ** (cnt-1)) #최소값은 10, 100과 같이 끝내면됨
        max += '1' * cnt #최대값은 11, 111과 같이 끝내면됨
    4.特別注意事項
  • ルールが見つかれば、実現は難しくありません.
  • 5.コード実装
    num = input()
    min, max = '', ''
    cnt = 0
    
    for n in num:
        if n == 'M':
            cnt += 1
        else:
            if cnt > 0:
                min += str((10 ** cnt)+5)
                max += str(5 * (10 ** cnt))
            else:
                min += '5'
                max += '5'
            cnt = 0
    
    if cnt > 0:
        min += str(10 ** (cnt-1))
        max += '1' * cnt
    
    print(max)
    print(min)