python

[Python 미니세션] 최소값의 인덱스 구하기

kinggoddino 2024. 7. 17.

▶  문제

  • 최소값의 인덱스를 구하는 함수 만들기!
  • 시간복잡도 빅오 생각해보기
  • # [23, 20, 73, 98, 11, 4, 288]
  • # [33, 423, 32, 435, 235, 7, 56]

 

 제한사항

  • nums의 길이 3 ≤ n ≤ 100,000
  • 배열의 nums 원소는 정수
  • 배열의 원소는 중복된 값이 없다

 

▶ 풀이

def minimum_value(nums):                 # 함수정의(숫자리스트 받기)
    min_index = 0                        # 인덱스 받을 변수선언, 초기값 0
    for i in range(1, len(nums)):        # 1부터 ~ 길이까지 i에 하나씩 대입
        if nums[min_index] > nums[i]:    # nums[인덱스변수]보다 nums[i]가 작으면
            min_index = i                # 인덱스변수값을 i로 새로 선언
        
    return min_index                     # 최소값을 가진 인덱스 반환

print(minimum_value([23, 20, 73, 98, 11, 4, 288]))           # 5
print(minimum_value([33, 423, 32, 2, 56]))                   # 3

 

인덱스를 받을 변수를 선언하고, for문으로 리스트를 하나하나 돌면서 if 이전보다 더 작은 값에 해당하는 요소가 있다면 인덱스 값을 새로 갱신해줬다.

 

출력해보면 리스트의 최소값이 있는 주소를 알려줌. 성공!

 

range로 1부터 길이만큼 갯수를 설정하고 그걸 for문으로 하나하나 반복하고 있기 때문에, 입력값에 따라 알고리즘이 수행되는 시간이 선형적으로 증가한다. 기울기가 1인 y=x 그래프처럼.

 

그래서 내 코드의 빅오는 O(n)임.

 

def minimum_value(nums):               
    minimum = min(nums)           # min() 함수로 최소값 찾기
    return nums.index(minimum)    # .index(minimum)로 인덱스 찾기

 

이건 다른 학생이 푼거다. min 함수가 있었구나.

이렇게 간단하게 풀 수 있다니ㅎ

 

코딩은 '아 이런게 있었던것같은데' 하면서 찾아가며 풀면 된다는데,

난 이런게 있는 줄도 모르는 상황!

괜찮아 공부하면 돼

 

함수를 사용하니 코드가 훨씬 깔끔해 보인다. 하지만 min 함수의 내부 코드를 뜯어보면 역시 알고리즘 수행 시간이 선형적으로 증가하는 구조이기 때문에 for문과 같이 빅오는 O(n)에 해당한다.

 

그렇다고 모든 내장함수의 시간복잡도가 O(n)인건 아니고 케바케이기 때문에,

나처럼 이렇게 잘 모르는 상태에서 내장함수를 막 사용한다면 오히려 코드의 시간복잡도 테스트에서 실패할 수 있다고 한다.

 

나중에는 시간복잡도까지 고려하는 날이 오겠지? (올까)

그때까지 내가 짠 코드의 빅오 정도는 계산해낼 수 있도록 함수도 공부해놔야겠다.

 

 

 


 

'python' 카테고리의 다른 글

[Python 미니세션] 함수 *Asterisk  (0) 2024.07.12
[Python 미니세션] 딕셔너리 관련 함수  (0) 2024.07.11
[Python 미니세션] 기본문제  (0) 2024.07.10
[Python 기초] f-string  (0) 2024.07.09
[Python 기초] 집합 set  (0) 2024.07.09