코딩테스트/그리디
[코테] 무지의 먹방 라이브
수타.
2024. 9. 9. 12:41
https://school.programmers.co.kr/learn/courses/30/lessons/42891
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문제요약:
리스트를 앞에서부터 1씩 뺄 때, 0이 되면 지나치고 끝이면 다시 앞으로 돌아온다. k번째 빼면 몇번자리인지 구하시오
from collections import Counter,deque
def solution(food_times,k):
food= list(set(food_times[:]))
food.sort()
c = Counter(food_times)
l = len(food_times)
food=deque(food)
last = 0
while food:
m= food[0]
if k>=l*(m-last): #m바퀴 돌수있다 남은만큼
k-=l*(m-last) #k는 먹은만큼 빼주기
l-=c[m] #l은 m개수만큼 빼주기
last = food.popleft()
else:
break
#food에 남은게 없거나, k가 한바퀴를 못돌아
if food: #m-last만큼 못돌아도 한바퀴이상돌수있다면 어차피 몇번째를 먹는거니까 한바퀴 이내로 남게
k = k%l
for i,f in enumerate(food_times):
if f>=food[0]:
if k==0:
return i+1
k-=1
else:
return -1
sort를 통하여 오름차순으로 나타낸 뒤에 앞에서부터 즉 작은거부터 기준으로 그만큼 돌수 있냐 없냐 를 기준으로 구축해보았습니다. 예를들어 (2,5,6)으로 되어있을때 만약 k가 최소인 2 와 현재 남은 음식의 길이인 3을 곱한 6보다 크다면 이는 (0,3,4)로 바뀔수 있고 k는 그만큼을 빼주면 됩니다. 이런 생각을 기준으로 코드를 작성하였고, k = k%l을 한 이유는 만약 아까와같은 경우 (2,5,6)일때 k가 6보다 작아 포문이 끝나게 되었다고 가정해보면 이후로는 몇바퀴를 지나도 0이되는 경우 즉 len(food)가 달라질 일이 없기 때문에 1개가 남던, 4개(즉 1개 +3개(길이 l))가 남던 마지막으로 먹어야할 음식의 순서는 그대로이기 때문에 처리해 주었습니다.(계산효율성) 그리고 앞에서부터 차례대로 먹으며 순서를 찾았습니다.