[프로그래머스-LV2] 기능개발 풀이

아이엠강욱·2023년 5월 28일
0

코딩테스트

목록 보기
16/23

해당 문제를 확인하시고 싶으면 아래 링크를 통해 확인해주세요!
https://school.programmers.co.kr/learn/courses/30/lessons/42586?language=python3


문제는 해결했음! 테스트 케이스 모두 정상적으로 통과는 했다 헤헤

문제 설명

나의 풀이

from collections import deque

def solution(progresses, speeds):
    answer = []
    queue = deque([[progresses[i], speeds[i]] for i in range(len(progresses))])   # Queue 생성
    
    while queue:   # Queue가 빌때까지
        # 개발 진행
        for _ in range(len(queue)):
            project = queue.popleft()
            if project[0] < 100:   # 진행률이 100미만이면 진행률만큼 증가
                project[0] += project[1]
            queue.append(project)   # 다시 queue에다 넣어줌
        
        # 다음날 넘어가기 전 배포할 수 있는게 있는지 확인
        production = 0   # 배포한 기능 개수
        while queue:
            data = queue.popleft()   # 맨 위의 작업을 뺌
            if data[0] >= 100:   # 진행률이 100 (100이상)이면 배포진행
                production += 1
            else:   # 진행률이 100 미만인게 있으면 다음날로 넘어가야함
                queue.appendleft(data)   # 다시 원래 자리에 작업넣음
                break   # 배포단계 중단
        
        if production != 0:   # 배포한 기능이 있으면 결과배열에 넣음
            answer.append(production)
    
    return answer

나는 그냥 문제에 나와있는대로 깊게 생각하지 않고 진행했다.

  1. deque 라이브러리를 사용해서 입력받은 데이터들을 조합해서 넣음
  2. queue에 작업이 남아있으면?
    a. 진행 상황이 100 미만이면 진행률만큼 진행상황 증가 + 다시 queue에 넣어줌
    b. 다음날로 넘어가기 전 밤에 배포할 수 있는게 확인한다. queue에서 맨 위의 작업을 하나 빼서 진행상황이 100이상이면 배포를 해버리고 100미만인걸 만나버리면 배포를 중단한다 + 그날의 배포개수 저장
  3. 작업들이 끝나면 로직 종료

이렇게 되니까 테스트케이스는 통과했지만.. 반복문의 개수가 너무 많아지고 비효율적인 것 같다는 생각이 들었다. 물론 실제 코딩테스트였으면 통과했겠지만.. 그래도 많이 아쉬운..?

그래서 다른 사람의 풀이를 조금 참고했다.

다른 분들의 풀이

def solution(progresses, speeds):
    answer = []
    time = 0
    count = 0 
    
    while progresses:
        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

위의 풀이는 일단 queue를 사용하지 않았다.
나의 풀이보다 많이 간결해보이고 이해하기 쉬운 코드여서 가져와봤다.

나는 queue를 사용했고 그 queue를 한번 반복문으로 순회를 해서 작업률만큼 추가해주는 작업이 있었는데, 위의 풀이에서는 작업률을 추가해주는 작업은 딱히 없는 것이다.

progresses[0] + time * speed[0] >= 100을 통해 값을 저장하지 않고 계산만 해서 진행상황이 100이상이면 그 작업은 배포가 가능하기 때문에 배포를 해버린다.

그리고 100미만이면 time을 추가하는데 이때 count(배포 개수)가 0 이상이면 이전에 배포를 한적이 있다는 뜻이고 배포를 진행하다가 진행상황이 100미만인걸 만났기 때문에 배포가 중단되어야 하니까 count를 다시 0으로 세팅해준다.

회고

위의 코드에서는 반복문을 1개만썼는데... 나는 어떻게보면 반복문을 총 4개나 써버렸다.
코딩테스트에서는 그렇다치고.. 만약에 회사에 가서 두 코드를 비교한다면 당연히 나같아도 위의 코드를 택할 것 같다.

실제 코딩테스트에서는 시간이 부족하니까 어쩔수 없겠지만 개인공부나 프로젝트할때는 항상 두번 세번 여러번 생각을 해서 효율적인 코드를 작성할 수 있었으면 좋겠다.

profile
블로그 이전했습니다!! https://dev-iamkanguk.tistory.com/ <<- 여기로 오세용!!

0개의 댓글