본문 바로가기

알고리즘

[파이썬][HackerRank]Luck Balance .python 문제 풀이

1. 문제 해석

레나가 코테에서 떨어질때마다.. 운이 쌓이는데 그것을 최대 스택으로 쌓고싶다는 내용이다.
행운 스택에는 음수도 있다는게 마음이 아팠다.. 레나의 모든 contest에 행운이 함깨하길 바란다.

L은 시험에 떨어질때 얻는 행운수이고T는 중요한 시험 여부이다.
k는 중요한 시험에서 더이상 질수없는 횟수이다. 한국말이라 이상한데 she cannot lose more than k 이렇게 보면 된다.
따라서 피통이 k=4이면 T가 1인(중요한시험에서) L을 얻을때마다(질때마다) 피가 까인다고 생각하자.
영어라 문제를 이해하는데 시간이 좀 걸렸다..

2. 접근 방법

행운을 최대로 모아야 하므로.. 일단 최대한 져야한다.
T를 보면...~
0 : 안중요한 시험 일때는 무조건 지면된다.
1: 중요한 시험 일때는 행운이 큰 수 부터 진후에.. 더이상 질 수 있는 횟수가 남아있지 않으면 이기면 된다.
뇌로 간단하게 생각할 수 있다. 이것을 코드로 생각해본다면 역시나 또 sort함수로 접근하면 된다.. 조건을 붙여서..
따라서 0일때는 무조건 져도되고 K도 소모하지 않는다. (피통 개념으로 생각하자) 0부터 소모할 수 있도록
순서를 0먼저 정렬하고~ (이렇게 나눈다면 0은 사실 정렬 안해도 된다. 그렇지만 0만정렬 안되게 하는 코드가 더 복잡할것같아 그냥 정렬하였다.) 1이 오도록 한 다음~ 행운이 큰 순서대로 지면된다. K가 존재할때까지..
그러면 sort에 조건을 붙이는 것은 lambda로 하면 되는것을 고수님들이 쓰는걸 본기억이 있으니 써먹자.

요약 1. greedy이므로 행운을 최대로 쌓기 2.최대가 되려면 최대한 많이 지기 3. T=0일때 는 다져도되므로 먼저 진다. 4. T=1일때는 큰 행운부터 지다가, 더이상 못지게되면 행운이 최소인 값으로 이긴다.

def luckBalance(k, contests): least_lose = k luck = [] sct = sorted(contests,key = lambda x : (x[1],-x[0])) print(sct) i=0 while sct : poped = sct.pop(0) if poped[1] == 1 : #important ... if least_lose == 0: luck.append(-poped[0]) #win else : #she can more lose.. luck.append(poped[0]) #lose least_lose -= 1 elif poped[1] == 0 :#non import luck.append(poped[0]) #lose i += 1 print(luck) return sum(luck)

print()와 주석을 달아놓았으니 코드를 실행해보면 이해하기 쉬울 것 같다.