minzzl
[프로그래머스] - 스택/큐. 기능개발 본문
안녕하세요 ~!
스택 큐는 아주 스무스 하게 해나가고 있습니다 ..
그럼에도 이렇게 블로그에 남기게 된 이유는 아차했던 부분을 짚고 넘어가기 위함입니동 그라미 !
문제
풀이
솔직하게 말하면 ..
입출력 예시를 보기 전까지는 문제 이해도 못했습니다 ~! ^^
예시를 주셔서 넘 감사합니다 ...
작업 모두 100까지 채워지도록 해야하고, 각각의 잡업이 100까지 채워지는 속도는 모두 다릅니다.
또한, 앞의 작업이 완료 될 때까지, 뒤의 잡업이 완료 되었더라도 기다려야하죠.
사실 100까지 채워지도록 하는 일수까지는 계산하는 것이 아주 쉽습니다.
그냥 각각의 작업들이 100까지 채워지려면 얼마나 남았는지 계산하고,
이를 그 작업의 속도에 맞게 남은 일수를 계산하면 됩니다.
그런 다음에 앞의 작업이 완료될 때 까지 뒤의 작업은 기다려야하고, 기다리고 있었다면 앞의 작업이 완료되는 시점에 같이 끝내면 되는데,
각 시점에 완료되는 기능의 수를 answer 배열에 넣어주어야합니다.
저는 왜인지 모르겠지만 Greedy 가 생각이 났습니다.
남은 일수를 담아 놓은 배열을 돌면서 더 큰 일수를 만날 때 까지 누적해서 count하고, 만나면 현재까지의 누적값을 answer 배열에 넣는 것이죠.
아 !
그리고 테스트 케이스 11번이 계속 오류가 났었는데 ...
제가 나머지 일수를 계산하는 연산에서 // 를 썼었는데...
// 연산은 소숫점 이하를 버린다는 것을 잊고 있었습니다....
만약 몫이 2.33 이었다면
일수는 3일이 되어야겠죠 ....?
그래서 나누어 떨어지지 않는 경우를 고려해서 코드 수정했습니다람쥐
나의 코드
def solution(progresses, speeds):
answer = []
diff = []
for i in range(len(progresses)):
diff.append(100-progresses[i])
for i in range(len(speeds)):
# // 연산은 나누기 할 때 소수점 이하를 버린다 .. 이를 주의해야함 !
#만약 나누어 떨어지지 않는 값이라면 ...
if diff[i]%speeds[i] != 0:
diff[i] = diff[i]//speeds[i] + 1
else:
diff[i] = diff[i]//speeds[i]
max = 0
cnt = 1
for i in range(len(diff)):
if i == 0:
max = diff[i]
else:
if diff[i]<=max:
cnt += 1
else:
answer.append(cnt)
cnt = 1
max = diff[i]
answer.append(cnt)
return 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]
저번 글에서도 적었지만 ...
zip 함수를 정말 많이 사용하네요 ...
근데 저한테는 아직 zip 이 낮설어서인지 사용하기가 쉽기 않은 것 같습니다 ..
번거롭지 않게 코드를 작성하는데에는 최고의 방법이지만, 아직은 힘드네욤 ...후하하하
'Algorithm > 프로그래머스' 카테고리의 다른 글
[프로그래머스] - 정렬. 가장큰수 (0) | 2023.04.21 |
---|---|
[프로그래머스] - 정렬. K번째 수 (0) | 2023.04.20 |
[프로그래머스] - 스택/큐.같은 숫자는 싫어 (0) | 2023.03.06 |
[프로그래머스] - 해시.전화번호 목록 (0) | 2023.02.28 |