코테 준비하기
프로그래머스 : 기능개발 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] 이용!
전체적인 알고리즘을 간단하고 종합적인 방법으로 생각하도록 노력하기!