강승현입니다
    • 홈
    • 태그
    • 방명록

    카테고리

    • 전체 글 (118) N
      • 후기 (38)
        • 경험 (15)
        • SSAFY (9)
        • 코딩테스트 (3)
        • 넥스터즈 (6)
        • 회고 (5)
      • Degrees (2)
      • Tech (33) N
      • OnlineJudge (45)
    OnlineJudge

    Codeforces #634 Div2 A. Sequence with Digits

    CODe_byCODe_·2020. 5. 20. 23:44

    코드포스 634회 Div2 A번 문제풀이

     

    https://codeforces.com/contest/1355/problem/A

     

    Problem - A - Codeforces

     

    codeforces.com

     

     

    아래의 식을 만족한다.

     

    an+1 = an + minDigit(an) * maxDigit(an)

     

    <입력>

    케이스의 수 t와

    정수 a, k가 입력된다.

     

    <예시입력>

    1) a=1, k=4 일 때 ak = 42

    2) a=487, k=1 일 때 ak = 487

    3) a=487, k=2 일 때 ak = 519

    4) a=487, k=7 일 때 ak = 628

     

     

    영어를 몰라도 Note를 보면 어떤 문제인지 이해가 될 것이다..


     

    a1이 1일 때 k를 계속 증가시켜보면 1, 2, 6, 42, 50, 50, 50... 계속해서 50이 반복된다.

     

    k an+1 ak
    1 - 1
    2 a2 = a1 + min(a1) * max(a1)
    = 1 + min(1) * max(1)
    2
    3 a3 = a2 + min(a2) * max(a2)
    = 2 + min(2) * max(2)
    6
    4 a4 = a3 + min(a3) * max(a3)
    = 6 + min(6) * max(6)
    = 6 + 6 * 6
    42
    5 a5 = a4 + min(a4) * max(a4)
    = 42 + min(4, 2) * max(4, 2)
    = 42 + 2 * 4
    50
    6 a6 = a5 + min(a5) * max(a5)
    = 50 + min(5, 0) * max(5, 0)
    = 50 + 0 * 5
    50

    한 번이라도 0이 포함되면 그 이후엔 계속 결과값이 전과 동일하게 유지가 된다.(min 함수에서 계속 0이 선택되니까) 그래서 반복문을 돌릴 때도 0이 있으면 break를 해주면 된다.

     

    처음엔 모스 알고리즘이 생각나서 어렵게 풀다가 설마 A번부터 이런 난이도가 나올까 하여 싹 갈아엎고 30분은 잡고 있었다. DP로 풀어도 봤는데 계속되는 시간초과에 다른 문제로 넘어갔고, 643회의 결과는 처참했다.

    대회 종료후 Editorial을 보고 나서야 이해를 했다.

     

     

    Python3

    import sys
    input = sys.stdin.readline
    
    def calc(x):
        m1=10
        m2=0
        while x>0:
            y = x%10
            x//=10
            m1=min(m1,y)
            m2=max(m2,y)
        return m1*m2
    
    t = int(input())
    while t:
        t-=1
        x,k = map(int,input().strip().split())
        k-=1
        while k:
            k-=1
            y = calc(x)
            if y==0:break	#0이 있으면 break
            x+=y
        print(x)

     

    반응형
    저작자표시 비영리 변경금지 (새창열림)
    'OnlineJudge' 카테고리의 다른 글
    • Educational Codeforces Round 100 (Rated for Div. 2) A.Dungeon
    • 백준 5676 음주코딩/세그먼트트리
    • Educational Codeforces Round 88 (Rated for Div. 2) A - Berland Poker 풀이
    • Educational Codeforces Round 88 (Rated for Div. 2) B - New Theatre Square 풀이
    CODe_
    CODe_
    개발과 관련된 다양한 정보를 몰입감있게 전달합니다.
    최신 글

    티스토리툴바