본문 바로가기
알고리즘/프로그래머스

프로그래머스 Lv2 기능개발 (python)

by 개발하는 호랑이 2024. 1. 31.

기능개발

풀이

스택/큐 문제라고 되어있지만, 난 그와 다른 방법으로 풀었다. 왜냐하면 큐 방법일 듯하다는 생각은 들지만, 어떻게 해야 큐 방법으로 끝낼 수 있는지 감이 오지 않았기 때문이다.
그래서 다음처럼 계획하고 문제를 풀었다.

  1. 우선 개발을 모두 마쳤을 때 각 개발마다의 작업일수를 구하기
  2. 앞선 것이 완성되었을 때만, 후 순위 기능이 배포가 가능을 이용
    2-1. 2중 for문을 이용해 현재 확인 하는 기능이 이미 배포가 되었으면, 다음 기능 확인.
    2-2. 배포가 안된 기능이라면 다음 기능을 확인하면서, 이후 기능들이 같이 배포될 수 있는지 확인.
    2-3. 이미 배포된 기능이면 또 다음 기능 확인.
  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

다들 똑똑하다. 분발해야지.