코테 준비하기

프로그래머스 : 기능개발 42586

케케_ 2024. 9. 11. 12:25

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

2일에 걸쳐 푼 문제,, 나는 똥 멍충이,,

 

 


내 코드

def solution(progresses, speeds):
    answer =[]
    n = 0 # 한번에 처리할 수 있는 일의 양
    c = [0]

    while 1:

        if c == [0]:
            c = [x + y for x,y in zip(progresses, speeds)]
        elif c == []:
            break
        else:
            c = [x + y for x,y in zip(c, speeds)]
            progresses = c[:]       #깊은 복사!
            
        #아래 반복문을 돌기 위한 배열
        #반복할 배열이 바뀌지 않게 해야함 --> 반복 끝나고 결과를 progresses, c 모두 업데이트 하는 방식?
        for i in progresses: 
            if i >= 100:        # 첫번째가 100이상이면
                del c[0]
                del speeds[0]
                n += 1
            else: break     #아니면 의미 없음 포문 끝
        if n > 0 : answer.append(n)
        n=0

    print(answer)
    return answer

progresses = [93,39,55] 
speeds = [1,30,5]

solution(progresses, speeds)
  • 매번 하는 실수인데, for문으로 돌리는 배열을 for 안에서 수정해 내가 원하는 값으로 반복문이 돌아가지 않게 하다가 수정한다.
    • 위에서도 for문의 progresses 부분에 c를 넣고 반복문 안에서 del c[0]를 해버리는 잘 돌아갈리가 없었다.
  • 그래서 반복문을 위한 배열로 progresses를 반복분이 끝나고 다시 들어가기 직전 c로 바꿔주었다.
  • 또 파이썬에서 배역을 그냥 복사하면 얕은 복사로 같은 배열을 가르키게 된다.
    • [:]를 사용해 깊은 복사를 사용했다.

 


 

다른 분들의 풀이 - 이렇게 짧게 할 수 있는거였다니,,,

# 문제가 개편되었습니다. 이로 인해 함수 구성이나 테스트케이스가 변경되어, 과거의 코드는 동작하지 않을 수 있습니다.
# 새로운 함수 구성을 적용하려면 [코드 초기화] 버튼을 누르세요. 단, [코드 초기화] 버튼을 누르면 작성 중인 코드는 사라집니다.
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) : 각 기능에 필요한 작업 일 수
  • 이차원 배열 사용
    • Q[i][j] =[[배포까지 걸리는 날짜 수, 배포할 기능 수],[배포까지 걸리는 날짜 수, 배포할 기능 수]] 
    • Q가 비었거나, Q의 마지막 요소의 날짜 수가 -((p-100)//s)보다 작으면(다음 기능이 앞보다 배포 준비가 오래 걸리면)
      • Q의 마지막 요소로 append
    • 다음 기능이 바로 앞 기능보다 배포준비가 빨리 끝나면
      • 바로 앞 기능과 함께 배포 가능하므로
        • 앞기능을 날짜의 배포 수른 나타내는  Q[-1][1]에 +1
  • 결과는 각 요소의 두번째 값을 출력하면됨

 


마지막 요소에 접근하기 [-1] 이용!

전체적인 알고리즘을 간단하고 종합적인 방법으로 생각하도록 노력하기!