겉바속촉

[PYTHON] 파이썬 _가장 작은 두 값 찾기 본문

IT 일기 (상반기)/PYTHON

[PYTHON] 파이썬 _가장 작은 두 값 찾기

겉바속촉 2021. 1. 6. 18:32
728x90
반응형

 

안녕하세요

겉바속촉입니다

!^^!

 

 

!!파이썬 시작하기!!

 

 

 

이번에는

가장 작은 두 값을

여러가지 방법들로 도출시켜볼게요

 

그리고

그 방법들 중에서 어떤 것이 제일 좋은지도

알아볼게요

 

 

 

 


 

 

 

가장 작은 두 값 찾기

 

 

가장 작은 값은 우리가 찾기 쉬운데

두 개를 찾는 것이 목표입니다

 

 

어떻게 하면 될까요???

 

 

가장 작은 값과 인덱스 에 대해서 생각해봅시다 ^_____^

 

 

 

 

방법1) 찾고 삭제하고 찾기

 

from typing import List, Tuple

# 방법1. 찾고 삭제하고 찾기
def method_1(L: List[float]) -> Tuple[int,int]:

    # L에서 가장 작은 항목을 구한다
    smallest = min(L)

    # 가장 작은 항목의 인덱스를 구한다.
    min1 = L.index(smallest)

    # 리스트에서 그 항목을 삭제한다
    L.remove(smallest)

    # 리스트에서 다음으로 가장 작은 항목의 인덱스를 구한다.
    next_smallest = min(L)

    # 두번째 가장 작은 수의 인덱스
    min2 = L.index(next_smallest)

    # 가장 작은 항목을 리스트에 다시 넣는다.
    L.insert(min1, smallest)

    # 필요에 따라 두 번째 인덱스를 조정한다.
    if min1 <= min2:
        min2 += 1

    # 두 인덱스를 반환한다.
    return (min1, min2)

items = [809, 834, 477, 478, 307, 122, 96, 102, 324, 476]
result = method_1(items)
print(result)


 

결과

 

 

 

 

 

 

 

 

 

방법2) 정렬해서 최솟값을 찾은 후 인덱스 구하기

 

from typing import List, Tuple

# 방법2. 정렬해서 최소값을 찾은 후 인덱스 구하기
def method_2(L: List[float]) -> Tuple[int,int]:

    # L의 복사본을 정렬한다
    sorted_list = sorted(L)

    # 가장 작은 두 수를 구한다
    smallest = sorted_list[0]
    next_smallest = sorted_list[1]

    # 원래 리스트 L에서 두 수의 인덱스를 구한다.
    min1 = L.index(smallest)
    min2 = L.index(next_smallest)

    # 두 인덱스를 반환한다
    return (min1, min2)

items = [809, 834, 477, 478, 307, 122, 96, 102, 324, 476]
result = method_2(items)
print(result)

 

 

 

 

 

 

 

 

방법3) 리스트 전체 훑기

 

from typing import List, Tuple

# 방법3. 리스트 전체 훑기
def method_3(L: List[float]) -> Tuple[int,int]:

    # L의 맨 앞부분에서 가장 작은 값과 두 번째로 작은 값의 인덱스를 min1과 min2에 할당한다
    if L[0] < L[1]:
        min1, min2 = 0, 1
    else:
        min1, min2 = 1, 0

    # 리스트 내 각 값을 순서대로 확인한다.
    # 더 작은 값을 찾으면 인덱스를 업데이트 한다.
    for i in range(2, len(L)):
        if L[i] < L[min1]:
            min1, min2 = i, min1
        elif L[i] < L[min2]:
            min2 = i

    # 두 인덱스를 반환한다.
    return (min1, min2)

items = [809, 834, 477, 478, 307, 122, 96, 102, 324, 476]
result = method_3(items)
print(result)

 

 

 

 

 

그렇다면 방법 3가지 중에서 무엇이 제일 효율적일까요??

 

함수 시간을 측정해주는 것입니다:)

함수의 실행 시간을 반환하는 함수를 만들어줄게요!!

 

def func_runtime(find_func: Callable[[List[float]], Any], lst: List[float]) -> float: 
    t1 = time.perf_counter()
    find_func(lst)
    t2 = time.perf_counter()
    return (t2 - t1) * 1000.0

 

그래서 위의 방법 3가지를 함께 넣고 import 추가해주세요:)

 

from typing import List, Tuple, Any, Callable
import time

# 방법1. 찾고 삭제하고 찾기
def method_1(L: List[float]) -> Tuple[int,int]:

    # L에서 가장 작은 항목을 구한다
    smallest = min(L)

    # 가장 작은 항목의 인덱스를 구한다.
    min1 = L.index(smallest)

    # 리스트에서 그 항목을 삭제한다
    L.remove(smallest)

    # 리스트에서 다음으로 가장 작은 항목의 인덱스를 구한다.
    next_smallest = min(L)

    # 두번째 가장 작은 수의 인덱스
    min2 = L.index(next_smallest)

    # 가장 작은 항목을 리스트에 다시 넣는다.
    L.insert(min1, smallest)

    # 필요에 따라 두 번째 인덱스를 조정한다.
    if min1 <= min2:
        min2 += 1

    # 두 인덱스를 반환한다.
    return (min1, min2)

# items = [809, 834, 477, 478, 307, 122, 96, 102, 324, 476]
# result = method_1(items)
# print(result)


# 방법2. 정렬해서 최소값을 찾은 후 인덱스 구하기
def method_2(L: List[float]) -> Tuple[int,int]:

    # L의 복사본을 정렬한다
    sorted_list = sorted(L)

    # 가장 작은 두 수를 구한다
    smallest = sorted_list[0]
    next_smallest = sorted_list[1]

    # 원래 리스트 L에서 두 수의 인덱스를 구한다.
    min1 = L.index(smallest)
    min2 = L.index(next_smallest)

    # 두 인덱스를 반환한다
    return (min1, min2)

# items = [809, 834, 477, 478, 307, 122, 96, 102, 324, 476]
# result = method_2(items)
# print(result)


# 방법3. 리스트 전체 훑기
def method_3(L: List[float]) -> Tuple[int,int]:

    # L의 맨 앞부분에서 가장 작은 값과 두 번째로 작은 값의 인덱스를 min1과 min2에 할당한다
    if L[0] < L[1]:
        min1, min2 = 0, 1
    else:
        min1, min2 = 1, 0

    # 리스트 내 각 값을 순서대로 확인한다.
    # 더 작은 값을 찾으면 인덱스를 업데이트 한다.
    for i in range(2, len(L)):
        if L[i] < L[min1]:
            min1, min2 = i, min1
        elif L[i] < L[min2]:
            min2 = i

    # 두 인덱스를 반환한다.
    return (min1, min2)


# 함수의 실행 시간을 반환하는 함수
def func_runtime(find_func: Callable[[List[float]], Any], lst: List[float]) -> float: 
    t1 = time.perf_counter()
    find_func(lst)
    t2 = time.perf_counter()
    return (t2 - t1) * 1000.0


items = [809, 834, 477, 478, 307, 122, 96, 102, 324, 476]

t1 = func_runtime(method_1, items)
t2 = func_runtime(method_2, items)
t3 = func_runtime(method_3, items)

print(t1)
print(t2)
print(t3)

 

 

 

그럼 결과를 계속 실행시켜보면 시간이 모두 다른데

방법 2가 가장 빠른 걸 알 수 있죠!!

 

 

 

 

 

728x90
반응형