https://programmers.co.kr/learn/courses/30/lessons/42586
코딩테스트 연습 - 기능개발
프로그래머스 팀에서는 기능 개선 작업을 수행 중입니다. 각 기능은 진도가 100%일 때 서비스에 반영할 수 있습니다. 또, 각 기능의 개발속도는 모두 다르기 때문에 뒤에 있는 기능이 앞에 있는
programmers.co.kr
- 반환 순서에 집착하면 Stack / Queue문제이다
- 업데이트 되는 값을 꼭 다 저장할 필요는 없다
- While은 조건이 True일 때, 실행의 반복이다 조건문이 아니다
def solution(progresses, speeds):
answer = []
cnt = 0
#FIFO -> stack
while(progresses):
if progresses[0] >= 100:
progresses.pop(0)
speeds.pop(0)
cnt+=1
else:
#아직 100이 안된거라 진도율 더하기
for i in range(len(progresses)):
progresses[i] += speeds[i]
#100된거 없으니 pop된거 있나
if cnt != 0:
answer.append(cnt)
cnt = 0
#마지막에 if문 걸린건 else문을 안타서 append 한번 더
answer.append(cnt)
return answer
0. progresses와 speeds를 각각 stack으로 생각하기
1. progress가 남아있는 동안
1-1. 가장 위에 있는 것이 100보다 크면
1-1-1. cnt++
1-1-2. progress랑 speed 둘 다 pop
1-2. 아직 100보다 안크면
1-2-1. 하나씩 각자 speed만큼 더해주기
1-2-2. cnt가 0이 아니면 1-1로직에서 100보다 컸다는 뜻이니 answer에 append 후에 cnt 초기화
1차 시도 - Fail
def solution(progresses, speeds):
answer = []
stack = []
speed_rvs = []
cnt = 0
for i in range(len(progresses)):
stack.append(progresses[len(progresses)-1-i])
for i in range(len(speeds)):
speed_rvs.append(speeds[len(speeds)-1-i])
while len(stack) > 0:
if stack[-1] >= 100:
cnt += 1
stack.pop()
speed_rvs.pop()
else:
for i in range(len(stack)):
stack[i] += speed_rvs[i]
if cnt != 0: answer.append(cnt)
cnt = 0
return answer
cnt를 더해주는 부분이랑 초기화해주는 부분 위치를 잘못찾았다.
2차 시도
def solution(progresses, speeds):
answer = []
stack = []
speed_rvs = []
cnt = 0
for i in range(len(progresses)):
stack.append(progresses[len(progresses)-1-i])
for i in range(len(speeds)):
speed_rvs.append(speeds[len(speeds)-1-i])
while len(stack) > 0:
if stack[-1] >= 100:
cnt += 1
stack.pop()
speed_rvs.pop()
else:
for i in range(len(stack)):
stack[i] += speed_rvs[i]
if cnt != 0:
answer.append(cnt)
cnt = 0
answer.append(cnt)
return answer
위치를 찾아서 Pass
다른 사람들 풀이를 보니 stack의 pop을 꼭 맨 뒤의 것이 아니라 인자를 줘서 특정 index부터 pop이 가능함을 알게됨
그래서 reverse해서 굳이굳이 stack 배열을 만든 것을 수정
3차 시도 - 최종 제출
def solution(progresses, speeds):
answer = []
cnt = 0
while len(progresses) > 0:
if progresses[0] >= 100:
cnt += 1
progresses.pop(0)
speeds.pop(0)
else:
for i in range(len(progresses)):
progresses[i] += speeds[i]
if cnt != 0:
answer.append(cnt)
cnt = 0
answer.append(cnt)
return answer
0. progresses와 speeds를 각각 stack으로 생각하기
1. progress가 남아있는 동안
1-1. 가장 위에 있는 것이 100보다 크면
1-1-1. cnt++
1-1-2. progress랑 speed 둘 다 pop
1-2. 아직 100보다 안크면
1-2-1. 하나씩 각자 speed만큼 더해주기
1-2-2. cnt가 0이 아니면 1-1로직에서 100보다 컸다는 뜻이니 answer에 append 후에 cnt 초기화
4차 시도
def solution(progresses, speeds):
answer = []
cnt = 0
time = 0
while len(progresses) > 0:
if (progresses[0]+speed[i]*time)>= 100: #검사
cnt += 1
progresses.pop(0)
speeds.pop(0)
else: #덧셈처리(time)
if cnt != 0:
answer.append(cnt)
cnt = 0
time += 1
answer.append(cnt)
return answer
더해주는 것을 꼭 list에 업데이트 시킬 필요X
대신 time변수를 새로 선언해줘서 몇번 speed를 더해줘야하는지 계산
'Algorithm > 프로그래머스' 카테고리의 다른 글
[프로그래머스] [Python] Level2_다리를 지나는 트럭 (0) | 2021.08.04 |
---|---|
[프로그래머스] [Python] Level2_프린터 (0) | 2021.08.03 |
[프로그래머스] [Python] Level2_위장 (0) | 2021.08.02 |
[프로그래머스] [Python] Level2 - 더 맵게 (2) | 2021.08.02 |
[프로그래머스] [Python] Level1_체육복 (0) | 2021.08.01 |
댓글