기능개발
풀이
스택/큐 문제라고 되어있지만, 난 그와 다른 방법으로 풀었다. 왜냐하면 큐 방법일 듯하다는 생각은 들지만, 어떻게 해야 큐 방법으로 끝낼 수 있는지 감이 오지 않았기 때문이다.
그래서 다음처럼 계획하고 문제를 풀었다.
- 우선 개발을 모두 마쳤을 때 각 개발마다의 작업일수를 구하기
- 앞선 것이 완성되었을 때만, 후 순위 기능이 배포가 가능을 이용
2-1. 2중 for문을 이용해 현재 확인 하는 기능이 이미 배포가 되었으면, 다음 기능 확인.
2-2. 배포가 안된 기능이라면 다음 기능을 확인하면서, 이후 기능들이 같이 배포될 수 있는지 확인.
2-3. 이미 배포된 기능이면 또 다음 기능 확인. - 2를 반복 후 answer에 입력된 값을 반환
을 사용했다.
다행히 문제가 해결되었다.
# 뒤에 있는 기능이 먼저 개발가능, 뒤에 있는 기능은 앞에 있는 기능 배포시 같이 배폴
# 배포 순서. progresses.
# 개발 속도 speeds.
# 배포 때마다 몇 개의 배포되는지 return
# 배포는 퇴근전 하루에 한 번.
# 며칠 작업인지 계산한 리스트를 이용해서 그 리스트를 순서대로 이용
def solution(progresses, speeds):
answer = []
N = len(progresses)
during_days = [0]*N
# 모든 개발이 완료 될 때까지 진행
while sum(progresses) < (N*100):
# 개발 진행
for j in range(len(progresses)):
# 개발 미완료시 개발 일 작성
if progresses[j] < 100:
progresses[j] += speeds[j]
# 개발 완료시 개발 진척도를 100으로 고정
if progresses[j] >= 100:
progresses[j] = 100
# 개발 작업일 하루 추가
during_days[j] += 1
end = []
for a in range(N):
if a in end:
continue
numbers = 1
end.append(a)
for b in range(1,N):
# 이미 배포했으면 다음 것 확인
if b in end:
continue
# 오직 앞선 개발이 뒤에 개발보다 늦게 끝나야, 뒤에 개발도 같이 배포 가능
elif during_days[a] < during_days[b]:
break
# 먼저 한 개발보다 빠르거나 같은날에 끝냈으면 같이 배포
elif during_days[a] >= during_days[b]:
end.append(b)
numbers += 1
answer.append(numbers)
return answer
다른 사람 풀이
2개를 찾았다.
1개는 zip을 쓴 방식이고, 다른 1개는 깔끔한 풀이였다.
방법 1
zip을 이용해 progresses, speeds를 한 번에 묶어서 p, s를 구분해 주었고,
for문 한 번으로 해당 for문 안에서 개발 완성일 자를 확인하고, 그 개발일자가 앞선 것보다 느리게 끝나면, Q에 append, 아니면 Q [-1]에 +1 하는 방법을 이용했다.
def solution(progresses, speeds):
Q=[]
for p, s in zip(progresses, speeds):
if len(Q)==0 or Q[-1][0]<-((p-100)//s):
Q.append([-((p-100)//s),1])
else:
Q[-1][1]+=1
return [q[1] for q in Q]
방법 2
queue의 방식을 이용하였다.
각 기능이 진행이 완료될 때까지 time과 connt 변수를 이용해, while문을 돌면서 pop()을 활용하면서, 현재 보고 있는 기능개봘과 기능개발 속도가 같거나 더 빠르면 count를 +1 해주고, 그렇지 않다면, time을 +1 하면서 이전의 count를 answer.append()함으로 계산을 해주었다.
def solution(progresses, speeds):
print(progresses)
print(speeds)
answer = []
time = 0
count = 0
while len(progresses)> 0:
if (progresses[0] + time*speeds[0]) >= 100:
progresses.pop(0)
speeds.pop(0)
count += 1
else:
if count > 0:
answer.append(count)
count = 0
time += 1
answer.append(count)
return answer
다들 똑똑하다. 분발해야지.
'알고리즘 > 프로그래머스' 카테고리의 다른 글
프로그래머스 Lv2 카펫(python) (0) | 2024.01.31 |
---|---|
프로그래머스 Lv2 N개의 최소공배수 (python) (1) | 2024.01.31 |
프로그래머스 Lv2 프로세스(python) (1) | 2024.01.30 |
프로그래머스 Lv2 구명보트 (python) (1) | 2024.01.30 |
프로그래머스 Lv1 [1차] 다트 게임 (python) (0) | 2024.01.30 |