[프로그래머스] Lv2 기능개발

do yeon kim·2022년 9월 7일
0
회고

스택과 큐가 아닌 다른 풀이 방식으로 접근 해서 문제를 풀어 보았다.

문제풀이에 있어서 어떤식으로 접근할 것인지에 따라서 풀이 방향이 달라지기 때문에 시작전에 대략적으로 어떤 식으로 풀이를 할 것인지를 생각하는 시간을 가졌던 것이 좋았다.

이전 까지는 무작정 코드를 치며, 하나하나 print()함수를 이용해서 확인해나가면서 코드를 구현하다보니 시간이 더 걸렸다. 또한 왜 이런 코드를 구현했는지를 이해하지 못했다.

하지만 이번에는 생각을 하고 이런식으로 구현을 할 것이다. 라고 정하니 코드를 구현함에 있어도 이전 보다 시간이 줄어들고, 왜 이런 코드가 필요한지에 대한 이해가 늘었다.



기능개발

https://school.programmers.co.kr/learn/courses/30/lessons/42586

import math
def solution(progresses, speeds):
    days = [math.ceil((100 - progresses[i]) / speeds[i]) for i in range(len(progresses))]
    stack = []
    answer = []
    queue = []
    for i in days:
        if len(stack) == 0:
            stack.append(i)
        elif stack[0] < i:
            queue.append(stack.pop())
            answer.append(len(queue))
            queue.clear()
            stack.append(i)
        else:
            queue.append(i)
    
    queue.append(stack.pop())
    answer.append(len(queue))    
    
    return answer
    
    
    
import math  
def solution(progresses, speeds):
    days = [math.ceil((100 - progresses[i]) / speeds[i]) for i in range(len(progresses))]
    stack = []
    answer = []
    queue = []
    
    stack.append(days[0])
    for i in range(1, len(days)):
        if stack[0] >= days[i]:
            queue.append(days[i])
        else:
            queue.append(stack.pop())
            answer.append(len(queue))
            queue.clear()
            stack.append(i)
    queue.append(stack.pop())
    answer.append(len(queue))

    return answer 

위에서 구현한 두개의 풀이 방식은 모두 스택과 큐를 이용해서 접근했다.
또한 days라는 새로운 변수를 만들어서 하나의 progresses가 걸리는 시간에 대한 날짜 리스트를 만들어서 사용했다.

먼저 stack에 days의 첫번째 요소를 넣어서 기준으로 삼는다. 그리고 반복문을 돌면서 뒤에 날짜가 앞의 날짜보다 작은 경우라면 먼저 완료되지만 우선순위가 뒤에 있으므로 queue에 넣어 주었고, 큰 경우라면 stack에 현재 들어 있는 것을 빼서 queue에 넣어준다. 그리고 새로운 날짜를 stack에 넣어주는 식으로 구현했다.

맨마지막에는 stack에 남아있는 것을 모두 빼서 queue에 append 해준뒤 반환하는 식으로 구현했다.



import math
def solution(progresses, speeds):
    days = [math.ceil((100 - progresses[i]) / speeds[i]) for i in range(len(progresses))]
    
    max     = days[0]
    count   = 0
    anwser  = []
    
    for i in days:
        if max >= i : 
            count += 1
            continue 
        else:
            max = i
            anwser.append(count)
            count = 1
    
    anwser.append(count)
    return anwser

위의 풀이는 stack과 queue를 사용하지 않은 풀이이다.
위와 같이 새로운 days변수를 만들고 days변수의 첫번째요소를 max로 지정해서 업데이트하며 뒤에 값이 작으면 count를 업데이트, 크면 anwser에 append하고 count를 1로 설정하는 식으로 구현했다.



zip()함수

zip() 함수는 두 그룹의 데이터를 서로 엮어주는 python의 내장함수이다.

두개의 순회가능한 리스트가 있다고 가정하자.

a =[1,2,3,4,5,]
b =["A","B","C","D","E"]

결과값으로 원하는 것은 (1,"A"), (2,"B"), (3,"C")... 이렇게 이다.

for i in a, b:
	print(i)

위와 같이 코드를 작성하게 되면 두개의 리스트를 하나의 for문 안에서 돌릴려고 하기 때문에 오류가 난다.

원래라면 아래와 같이 코드를 구현 할 것이다.

for i in range(len(a)):
	a = (a[i], b[i])
    print(a)

zip()함수를 이용하면 더 쉽게 코드를 구현할 수 있다.
zip함수를 이용해서 하나의 튜플 형태로 결과값을 반환 할 수 있따.

for i in zip(a,b):
	print(i)

병렬처리
이외에도 zip()함수를 이용해서 병렬처리도 가능하다.
i와 j에 각 각의 요소가 들어오게 된다.

for i, j in zip(a, b):
	print(i, j)

딕셔너리만들기

dict(zip(a, b))	
{1: "A", 2: "b", 3: "C", 4: "D", 5:"E"}


참고

https://www.daleseo.com/python-zip/

0개의 댓글