PROGRAMMERS Python Lv2. 기능 개발
이번 문제는 기능 개발이다.
나의 코드는 다음과 같다.
def solution(pro, sp):
minus_pro = []
div_li = []
answer = []
cnt = 1
for num in pro:
minus_pro.append(100 - num) # 남은 진도를 구해서 새로운 리스트에 append
total_li = list(zip(minus_pro, sp)) # 남은 진도와 하루 작업 능력 zip
for j in range(len(total_li)):
p,q = total_li[j][0] // total_li[j][1],total_li[j][0] % total_li[j][1]
if q == 0:
div_li.append(p)
else:
div_li.append(p+1) # 몫에 1 더하기
for s in range(len(div_li)-1):
if div_li[s] >= div_li[s+1]:
cnt += 1
if s+1 == len(div_li)-1:
answer.append(cnt)
break
else:
answer.append(cnt)
cnt = 1
if s+1 == len(div_li)-1:
answer.append(cnt)
break
return answer
위의 코드로 테스트 2개는 통과했는데, 정답 제출에서는 3개 빼고 전부 오답이었다.
우선 내가 접근한 방식은 다음과 같다.
-
각 단계별로 남은 진도를 구한다.
-
zip을 활용해서 각 단계별로 하루 최대 작업을 이어준다.
-
몫과 나머지를 구하는데, 만약 나머지가 발생한다면, 그것은 작업일수가 하루 더 추가된다는 것이니 if문을 통해 몫에 +1을 해준다.
-
이제 전부 완료까지 걸리는 작업일수를 저장한 리스트를 가지고 답을 구하면 된다.
-
숫자가 큰 것이 앞에 있어야 제출을 할 수 있는 것이므로, if문을 통해 cnt에 1씩 더해준다.
-
그렇지 않을 경우엔, 중단시키고, cnt를 리스트에 append 시킨다.
그렇지만, 위의 코드는 여러 테스크 케이스를 통과하지 못해서 이를 좀 더 수정했다.
def solution(pro, sp):
minus_pro = []
div_li = []
answer = []
for num in pro:
minus_pro.append(100 - num)
total_li = list(zip(minus_pro, sp))
for j in range(len(total_li)):
p,q = total_li[j][0] // total_li[j][1],total_li[j][0] % total_li[j][1]
if q == 0:
div_li.append(p)
else:
div_li.append(p+1)
while len(div_li) >0:
cnt = 1
a = div_li.pop(0)
div2 = div_li.copy()
for idx in range(len(div_li)):
if a >= div_li[idx]:
cnt += 1
div2.pop(0)
else:
break
answer.append(cnt)
div_li = div2.copy()
return answer
while 문과 pop, copy를 활용했다.
-
우선 제일 앞의 원소를 추출해주고, 우선 나머지 원소들을 담은 리스트를 복사해놓는다.
-
비교를 해주고, 만약 뒤의 원소가 작다면 리스트에서 삭제해준다.
-
뒤의 원소가 더 크다면 break를 시켜주면서 이전에 복사해둔 리스트를 위에서 다시 사용할 수 있게 해준다.
이번 문제를 통해 평소 리스트 원소 삭제를 하면서 비교하는 것이 고민이었는데, copy와 pop을 적절히 사용하면 된다는 것을 알았다. 그리고 이번 문제는 stack 알고리즘이라서, deque와 stack 알고리즘을 더 공부해야 할 것 같다.
댓글남기기