티스토리 뷰

링크: https://school.programmers.co.kr/learn/courses/30/lessons/12987

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

## Problem

최대로 이길 수 있는 수를 출력하면 된다.

그리디라고 생각했다.

하나를 정렬하고 비교해가면 될거라 생각함

## Solved

def solution(A, B):
    answer = 0
    A.sort(reverse = True)
    B.sort(reverse = True)
    for num in A:
        if num >= B[0]:
            continue
        else:
            answer += 1
            del B[0]
    return answer

테스트 1 〉    통과 (698.52ms, 18.3MB)
테스트 2 〉    통과 (665.34ms, 18.3MB)
테스트 3 〉    통과 (629.17ms, 18.1MB)

정리전 코드. 일단, 풀고나서 보니

  • continue 가 필요없을 것 같음
  • del 도 효율적이지 않은 사용으로 보였다.

## 변경 후

def solution(A, B):
    answer = 0
    A.sort(reverse = True)
    B.sort(reverse = True)
    i = 0
    for num in A:
        if num < B[i]:
            answer += 1
            i += 1
    return answer

테스트 1 〉    통과 (40.12ms, 18.5MB)
테스트 2 〉    통과 (38.96ms, 18.1MB)
테스트 3 〉    통과 (42.68ms, 18.2MB)

오우 del 을 변경하니 시간이 확 줄었다.

 

알게된 점

for loop 을 사용할 때 for each 가 나을지, for loop 가 나을지 궁금해졌다.

https://betterprogramming.pub/python-loops-performance-compared-the-fastest-is-b4638744a1ff

 

Python Loops Performance Compared: The Fastest Is…

Deeply analyzing Python for-each, for-range, and while loops to find the best one

betterprogramming.pub

 

Python 의 경우 While 보다 For 를 사용하면 FOR_ITER 라는 바이트코드가 제공되어 훨씬 적은 바이트코드수를 사용함을 알 수 있었다.

For-range와 For-each 도 크게 차이 안나나, range call function이 호출되다보니 for each 가 조금 더 효율이 좋아보였다.

 

For-range loop

# For-range loop
import dis
def loop():
    arr = [1,2,3,4,5]
    for i in range(5):
        print(arr[i])

..
..
             12 STORE_FAST               0 (arr)

  5          14 SETUP_LOOP              32 (to 48)
             16 LOAD_GLOBAL              0 (range)
             18 LOAD_GLOBAL              1 (len)
             20 LOAD_FAST                0 (arr)
             22 CALL_FUNCTION            1
             24 CALL_FUNCTION            1
             26 GET_ITER
        >>   28 FOR_ITER                16 (to 46)
             30 STORE_FAST               1 (i)

  6          32 LOAD_GLOBAL              2 (print)
             34 LOAD_FAST                0 (arr)
             36 LOAD_FAST                1 (i)
             38 BINARY_SUBSCR
             40 CALL_FUNCTION            1
             42 POP_TOP
             44 JUMP_ABSOLUTE           28
        >>   46 POP_BLOCK
        >>   48 LOAD_CONST               0 (None)
             50 RETURN_VALUE

For-each loop

# For-each loop
import dis
def each():
    arr = [1,2,3,4,5]
    for i in arr:
        print(i)

..
..
             10 BUILD_LIST               5
             12 STORE_FAST               0 (arr)

 11          14 SETUP_LOOP              20 (to 36)
             16 LOAD_FAST                0 (arr)
             18 GET_ITER
        >>   20 FOR_ITER                12 (to 34)
             22 STORE_FAST               1 (i)

 12          24 LOAD_GLOBAL              0 (print)
             26 LOAD_FAST                1 (i)
             28 CALL_FUNCTION            1
             30 POP_TOP
             32 JUMP_ABSOLUTE           20
        >>   34 POP_BLOCK
        >>   36 LOAD_CONST               0 (None)
             38 RETURN_VALUE