Python/알고리즘 연습

2. 최댓값 찾기

김아다만티움 2024. 7. 9. 12:11
* 책: 모두의 알고리즘 with 파이썬 


주어진 숫자 n개 중 가장 큰 숫자를 찾는 알고리즘을 만들어 보세요.

 

1. 관련 개념: python 리스트 다루기

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# 리스트 개념 확인
 
= [1,2,3,4,5,6,7,8,9,10]
a[0# 1
a[9# 10; n개 요소를 가진 리스트의 마지막 요소는 n-1 인덱스로 구할 수 있음
a[-1# 10
a[-2# 9
a[-10# 마이너스 인덱스 사용 시 n개 요소를 가진 리스트의 첫번째 요소는 -n 인덱스
 
 
 
# 리스트에서 많이 쓰이는 함수들 
# len(a), a.append(x), a.clear()는 생략
 
# a.insert(i, x) # a 라는 리스트의 i번째에 x 요소를 끼워넣음
#a.insert(10, 11)  # [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
 
# a.pop(i) # a 라는 리스트의 i번째 요소를 빼버리고 함수의 결괏값으로 돌려줌, 아무것도 없으면 마지막 요소를 빼버림 
a.pop() # 11 # a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
a.pop(8# 9 # a = [1, 2, 3, 4, 5, 6, 7, 8, 10]
 
 
# x in a 리스트 a안에 x라는 값이 있는지 없는지 확인
9 in a # False
 
#a.insert(8,9) # [1, 2, 3, 4, 5, 6, 7, 8, 10, 9]
9 in a # True
cs

 

2. 최댓값을구하는 알고리즘: O(n)

  1. 숫자들을 리스트에 잘 싼다.
  2. 리스트 첫번째 요소부터 순차적으로 비교한다.
  3. 가장 큰 값이 나왔을 때 멈춘다.
1
2
3
4
5
6
7
8
9
10
11
12
= [179218335873342]
 
def  find_max(a):
    n = len(a) # n값 초기화
    max_nm = a[0# max값 초기화
    for i in range(1, n):
        if max_nm < a[i]:
            max_nm = a[i] # max_nm 값을 if 조건에 따라 새로운 값으로 갱신
        
    return max_nm
 
find_max(v) # 92
cs

 

 

3. 최댓값의 인덱스를 구하는 알고리즘 : O(n)

  1. 숫자들을 리스트에 잘 싼다.
  2. 리스트 첫번째 요소부터 순차적으로 비교하되 인덱스만 본다.
  3. 가장 큰 값이 나왔을 때 멈추고 인덱스를 구한다. 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
= [179218335873342]
 
# 복잡하고 사서 고생하는 코드 
def  find_max_idx(a):
    n = len(a) # n값 초기화
    max_nm = a[0# max값 초기화, 초기화 했기 때문에 range가 1부터 시작
    for i in range(1, n):
        if max_nm < a[i]:
            max_nm = a[i]
            idx = i # 인덱스는 곧 i이니라
        
    return idx
    
find_max_idx(v) # 92의 인덱스인 1
 
 
# 더 간단한 방법이 있지롱
def find_max_idx(a):
    n = len(a)
    idx = 0 # 인덱스 초기화, 초기화 했기 떄문에 range가 1부터 시작 
    for i in range(1, n):
        if a[i] > a[idx]:
            idx = i # 조건에 맞는 인덱스로 교체
    
    return idx
 
find_max_idx(v) # 92의 인덱스인 1
cs

 

<연습문제>

리스트에 숫자 n개가 있을 때 가장 작은값을 돌려주는 알고리즘을 만들어보세요. + 인덱스도

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
# max 구하는 것에서 if 연산자만 바꾸면 바로 최솟값 가능 
 
= [179218335873342]
 
def  find_min(a):
    n = len(a) # n값 초기화
    min_nm = a[0# min값 초기화
    for i in range(1, n):
        if min_nm > a[i]:
            min_nm = a[i]
        
    return min_nm
 
find_min(v) # 7
 
 
 
# 그렇다면 인덱스 구하는 것도? 금방 가능
# 아래는 복잡한 버전 
= [179218335873342]
 
def  find_min_idx(a):
    n = len(a) # n값 초기화
    min_nm = a[0# min값 초기화
    for i in range(1, n):
        if min_nm > a[i]:
            min_nm = a[i]
        
    return i
 
find_min(v) # 7의 인덱스인 5
 
 
# 이게 심플한 버전
= [179218335873342]
 
def  find_min_idx(a):
    n = len(a) # n값 초기화
    idx = 0 # idx값 초기화
    for i in range(1, n):
        if a[i] < a[idx]:
            idx = i
            
    return idx
 
find_min_idx(v) # 7의 인덱스인 5
cs