2 minute read


할 일

  • 현장실습 - 과제작업
    • vuex 연동 - 리스트 보여주기
    • (+) 기능 정의서 작성
  • 알고리즘 문제풀이
  • backlog 만들기

현장실습 - 과제작업

https://www.notion.so/2020-ce018930754848d6a71531bb8c0949a6

backlog 만들기

과제를 위한 backlog?? 필요

알고리즘 문제풀이

백준 16434 - 드래곤 앤 던전

방의 개수 N ~ 123456 초기 공격력 Hatk ~ 1000000 ti, ai, hi (ti ∈ {1, 2}, 1 ≤ ai, hi ≤ 1,000,000)

ti가 1이면 적의 공격력 ai, 체력 hi 2이면 공격력 ai, 체력 hi 올려주는 포션

피를 1 남기고 이기도록.

어려운 점은, 최소의 maxhp를 찾는데 만약 포션이 없다면 피가 줄기만 하므로 적의 공격 총합만 계산하면 된다. 그런데 그렇지 않고 포션으로 자신의 공격력 및 체력이 오르기 때문에 어떤 식으로 해야할지 모르겠다. 체력 증가가 아주 예전에 걸렸던 캡에까지 영향을 줄 수 있기 때문에 그 부분부터 다시 보려면 시간이 오래 걸릴 수 있다. 그런데, 아무리 최대 체력을 증가시켜도, 절대적 체력을 생각해보면, 초기 최대 체력보다 증가하는 경우 그 구간은 어차피 캡에 걸리게 된다. 그렇다면 이제 신경쓸 부분은 그 이후이다. 그 이후에 죽는다면 죽지 않게만 캡을 늘리면 된다.

  • 피가 캡에 걸렸다는 것은, 이전 피보다 해당 구간까지 지나는데 피가 증가했다는 것. 따라서 체력을 너무 적게 설정하지 않는 이상 해당 구간에서는 죽지 않는다.
  • 그렇다면 각 cappos에 대해, 다음 cappos까지 살아남을 수 있는 최소 최대 체력을 구하고, 그 중 최대를 취한다면? 다음 cappos가 없는 경우 피 1을 남기도록.
py solution

결국 풀었다. 피를 무한이라 생각하고 최소값이 최대값과 비교하여 얼마나 떨어졌는지 알면 끝이었다.


def solve():
    import math
    # it('start')
    n, atk = ria()
    cur = 1000000000000
    maxv = cur
    lastcappos = -1
    minv = cur
    for i in range(n):
        t, a, h = ria()
        if(t == 1):
            turns = math.ceil(h/atk)
            hits = turns-1
            cur -= hits*a
            it(a, h, turns)
            minv = min(minv, cur)
        else:
            it(a, h)
            cur += h
            if(cur > maxv):
                cur = maxv
            atk += a
    it(maxv - minv + 1)

    # WRONG:

    # for i in range(n):
    #     t, a, h = ria()
    #     # it(t, a, h)
    #     # it('turn start. ', i, myhp, atk, t, a, h)
    #     if(t == 1):
    #         it('myhp', myhp)
    #         turns = math.ceil(h/atk)
    #         deathTurns = math.ceil(myhp/a)
    #         it('turns', turns)
    #         it('death', deathTurns)
    #         if(deathTurns < turns):
    #             myhp += (turns-deathTurns)*a
    #             hmax += (turns-deathTurns)*a
    #             deathTurns = math.ceil(myhp/a)
    #             it('newdeath', deathTurns)

    #             myhp = myhp - a*(deathTurns-1)
    #             it('left', myhp)
    #             if(myhp <= 0):
    #                 hmax += 1-myhp
    #                 myhp = 1
    #         else:
    #             myhp = myhp - a*(turns-1)
    #             it('left', myhp)
    #             if(myhp <= 0):
    #                 hmax += 1-myhp
    #                 myhp = 1
    #     else:
    #         myhp += h
    #         if(myhp > hmax):
    #             myhp = hmax
    #             lastcappos = i
    #         atk += a
    #         pass
    #     # it('turn end. ', i, myhp, atk)
    #     pass
    print(int(maxv-minv+1))
    pass


Comments