Development

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

코딩테스트/Python

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

yo~og 2021. 7. 23. 00:59
반응형

코드를 효율적이게 안짜서 그런지 모르겠는데.. 답은 빨리나왔다!!

일단 다른 분 코드 보기전에 내가 짠 코드 설명을 적겠다.,,

 

import math
def solution(progresses, speeds):
    answer = []
    
    for i in range(len(progresses)):
        progresses[i] = math.ceil((100-progresses[i])/speeds[i]) # 작업이 며칠 걸리는지 계산을 해준다.

  
    cnt=0
    while len(progresses)!=1: #  progresses[1]과 비교하므로 길이가 1이 아닐때까지 반복문 실행.
        if progresses[0] < progresses[1]: # 첫번째 작업이 두번째 작업보다 적게 걸리면
            progresses.pop(0) # 첫번째 작업을 삭제
            cnt+=1 # 작업 수를 1 더해준다.
            answer.append(cnt)
            cnt=0 
        else: // 첫번째 작업이 두번째 작업보다 많이 걸리거나 같으면
            cnt+=1
            a = progresses.pop(0) # 첫번째 작업 삭제
            progresses[0] = a # 삭제된 작업과 그 뒤 작업을 또 비교해야하므로 제일 앞에 있는 작업을 그 전에 삭제한 작업 수와 같게해준다.
            
        if len(progresses)==1:
            answer.append(cnt+1) # 마지막 작업 카운트한걸 넣어준다.
            
        
            
    return answer

나는  먼저 작업 시간을 다 계산 해둔 후, 첫번째와 두번째를 비교하여 answer에 추가하는 방식으로 풀었다.

 

 


다른사람의 풀이

 

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]

와.. 진짜 어렵다 ㅠㅠ 

먼저 -((p-100)//s) 이 부분은 필요한 작업 일수를 구하는 계산식이다. 음수로 몫을 구한다음 다시 양수로 바꿔주는게 내가 사용한 math.ceil과 동일하다. (올림)  그리고 q의 길이가 0(가장 첫번째)이거나 계산한 작업일수가 q에 들어간 가장 마지막 원소의 작업일수 보다 크다면 q에 추가해준다. 그 외에는 q의 배포가능한 기능 수를 1 더해준다.

 

이분은 천재같다..!!!!

 

 


새로운 지식!

 


zip

 - zip()은 동일한 개수로 이루어진 자료형을 묶어 주는 역할을 하는 함수이다.

 

예시)

>>> numbers = [1, 2, 3]
>>> letters = ["A", "B", "C"]
>>> for pair in zip(numbers, letters):
...     print(pair)
...
(1, 'A')
(2, 'B')
(3, 'C')
>>> for number, upper, lower in zip("12345", "ABCDE", "abcde"):
...     print(number, upper, lower)
...
1 A a
2 B b
3 C c
4 D d
5 E e

 

unzip

 - zip() 함수로 엮어 놓은 데이터를 다시 해체하고 싶을 때도 zip()함수를 사용한다.

>>> numbers = (1, 2, 3)
>>> letters = ("A", "B", "C")
>>> pairs = list(zip(numbers, letters))
>>> pairs
[(1, 'A'), (2, 'B'), (3, 'C')]

>>> numbers, letters = zip(*pairs) #unzip()
>>> numbers
(1, 2, 3)
>>> letters
('A', 'B', 'C')

 

zip을 이용하여 사전을 쉽게 만들 수 있습니다.

>>> keys = [1, 2, 3]
>>> values = ["A", "B", "C"]
>>> dict(zip(keys, values))
{1: 'A', 2: 'B', 3: 'C'}

 


파이썬에서 올림, 내림, 반올림 쓰는 방법

올림과 내림은 import math를 해줘야한다.

 

올림 - ceil()

>>> import math #math 모듈을 먼저 import해야 한다.
>>> math.ceil(-3.14)    #결과는 -3
>>> math.ceil(3.14) #결과는 4

 

내림 - trunc(), floor()

trunc()함수는 내림을 하더라도 0으로 향하는 반면 floor() 함수는 무조건 아래만 향해 내림한다. 참고로 math.trunc()함수는 int()와 같이 결과를 반환한다.

>>> import math
>>> math.floor(3.14)    #결과는 3
>>> math.floor(-3.14)   #결과는 -4

>>> math.trunc(-3.14)   #결과는 -3
>>> math.floor(-3.14)   #결과는 -4

>>> int(-3.14)  #결과는 -3
>>> math.trunc(-3.14)   #결과는 -3

 

반올림 - round()

>>> round(3.1415)   #결과는 3

>>> round(3.1415, 2)   #결과는 3.14

>>> round(31.415, -1)   #결과는 30.0

# round()는 사사오입 원칙을 따른다. 
# 반올림할 자리의 수가 5이면 반올림 할 때 앞자리의 숫자가 짝수면 내림하고 홀수면 올림 한다.

>>> round(4.5)  #결과는 4
>>> round(3.5)  #결과는 4

 

반응형
Comments