PROGRAMMERS Python Lv2. 기능 개발

1 분 소요

이번 문제는 기능 개발이다.

나의 코드는 다음과 같다.

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개 빼고 전부 오답이었다.

우선 내가 접근한 방식은 다음과 같다.

  1. 각 단계별로 남은 진도를 구한다.

  2. zip을 활용해서 각 단계별로 하루 최대 작업을 이어준다.

  3. 몫과 나머지를 구하는데, 만약 나머지가 발생한다면, 그것은 작업일수가 하루 더 추가된다는 것이니 if문을 통해 몫에 +1을 해준다.

  4. 이제 전부 완료까지 걸리는 작업일수를 저장한 리스트를 가지고 답을 구하면 된다.

  5. 숫자가 큰 것이 앞에 있어야 제출을 할 수 있는 것이므로, if문을 통해 cnt에 1씩 더해준다.

  6. 그렇지 않을 경우엔, 중단시키고, 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를 활용했다.

  1. 우선 제일 앞의 원소를 추출해주고, 우선 나머지 원소들을 담은 리스트를 복사해놓는다.

  2. 비교를 해주고, 만약 뒤의 원소가 작다면 리스트에서 삭제해준다.

  3. 뒤의 원소가 더 크다면 break를 시켜주면서 이전에 복사해둔 리스트를 위에서 다시 사용할 수 있게 해준다.

이번 문제를 통해 평소 리스트 원소 삭제를 하면서 비교하는 것이 고민이었는데, copy와 pop을 적절히 사용하면 된다는 것을 알았다. 그리고 이번 문제는 stack 알고리즘이라서, deque와 stack 알고리즘을 더 공부해야 할 것 같다.

댓글남기기