파이썬/파이썬 문제
greedy-(2)
백수진
2021. 8. 1. 21:42
1. 볼링공 고르기 [2019 SW 마에스트로 입학 테스트]
#볼링공 고르기 => 두사람이 무게가 다른 볼링공을 고르는 경우의 수를 출력하는 문제
n,m = map(int,input().split())
#n개의 공이 m까지의 숫자로 구성됨
w = list(map(int,input().split()))
count=0
for i in range(0,n-1):
for j in range(i+1,n):
if w[i]!=w[j]:
count+=1
print(count)
2. 무지의 먹방 라이브[2019 카카오 신입 공채]
#무지의 먹방 라이브
eat = list(map(int,input().split()))
k = int(input())
time =0
i=0
cnt=0
while True:
if time==k:
if eat[i]>0:
print(i+1)
break
if eat[i]>0:
eat[i]=eat[i]-1
time+=1
if i==len(eat)-1:
i=0
else:
i+=1
count=0
for j in range(0,len(eat)):
if eat[j]==0:
count+=1
if count==len(eat):
print("-1")
break
#https://programmers.co.kr/learn/courses/30/lessons/42891 에 참고
=> 무지의 먹방 라이브 문제를 위의 알고리즘에서 위의 사이트의 기본 소스코드에 맞게 변경한결과 효율성이 0점이 나왔고 아마도 for문을 돌려서 -1을 체크한 것이 원인인 것으로 보여지고 다시 생각해봐야할 문제.
=> 효율성 문제는 현재 그리디를 연습하기 위해서 다른 알고리즘을 사용하지 않았기때문에 발생한 것으로 보임.
=> 정확성에서 1문제가 틀린 부분은 시간초과가 나지 않게 코드를 줄여봄.
def solution(food_times, k):
time =0
i=0
if sum(food_times)<=k:
return -1
while True:
if time==k:
if food_times[i%len(food_times)]>0:
return i%len(food_times)+1
if food_times[i%len(food_times)]>0:
food_times[i%len(food_times)]=food_times[i%len(food_times)]-1
time+=1
i+=1
c = food_times.count(0)
if c==len(food_times):
return -1
위의 코드를 https://programmers.co.kr/learn/courses/30/lessons/42891#에 제출한 결과
해결방법 =>
- if문을 추가해서 -1 처리를 할 때 시간을 단축시켰고 while문에서는 i%len(food_time)를 활용해 나머지를 활용해 i를 증가시키며 마지막 값이 될때 0으로 돌아오게 하는 코드를 따로 작성할 필요를 없앰.
- 또한 for문으로 food_times에서의 0을 카운트할 때 .count()함수에 인자로 0을 넣어 작성해서 시간을 줄임
3. 만들 수 없는 금액[k대회 기출] => 다시하기