♻️효율적인 알고리즘이란 무엇일까

dev_itzel_02✨·2024년 10월 28일

♻️Algorithm

목록 보기
1/12
post-thumbnail

🃏숫자 카드 게임

숫자 카드 게임은 여러 개의 숫자 카드 중에서 가장 높은 숫자가 쓰인 카드 한 장을 뽑는 게임이다.

☝🏼조건

  1. 숫자가 쓰인 카드들이 N x M (행 x 열) 형태로 놓여 있다.
  2. 먼저 뽑고자 하는 카드가 포함되어 있는 행을 선택한다.
  3. 그다음 선택된 행에 포함된 카드들 중 가장 숫자가 낮은 카드를 뽑아야 한다.
    즉, 각 행의 가장 작은 숫자를 뽑는 것을 고려하여 최종적으로 가장 높은 숫자의 카드를 뽑을 수 있도록 전략을 세워야 한다.

🧐아이디어

각 행마다 가장 작은 수를 찾은 후, 그 중 가장 큰 수를 찾는 것❗

# code

📑if-else문 사용

start_time = time.time()
n, m = map(int, input().split())

max_value = 0
# 행별로 숫자 입력받기
for i in range(n):
    data = list(map(int, input().split()))
    min_value = min(data) # 각 행별 최소값 찾기
    if (min_value > max_value):
        max_value = min_value
    else:
        continue

print(max_value)
end_time = time.time()

print(f"Final memory usage: {memory_usage()} MB")
print("time:", end_time - start_time)

👉🏼 조건문이라는 추가 연산이 존재

📑min, max 함수 사용

start_time = time.time()
n, m = map(int, input().split())

result = 0
for i in range(n):
    data = list(map(int, input().split()))
    min_value = min(data)
    result = max(result, min_value)

print(result)
end_time = time.time()

print(f"Final memory usage: {memory_usage()} MB")
print("time:", end_time - start_time)

👉🏼 result 변수를 사용해 최종값을 반복적으로 갱신하여 마지막에 한번에 출력
👉🏼 min, max 라이브러리를 사용해 반복문이 간결하여 cpu 연산이 적음

📑리스트 사용

start_time = time.time()
n, m = map(int, input().split())

min_list = []
for i in range(n):
    data = list(map(int, input().split()))
    min_list.append(min(data))

print(max(min_list))
end_time = time.time()

print(f"Final memory usage: {memory_usage()} MB")
print("time:", end_time - start_time)

👉🏼 리스트 변수를 추가로 생성함
👉🏼 마지막 출력문에서 max 라이브러리를 호출하여 불필요한 메모리 사용과 연산이 추가됨

각각의 코드의 실행 시간과 메모리 사용량을 확인하고 싶어 코드를 추가했다.

  • 시간 확인을 위해서는 time 라이브러리를 import 하여 time() 함수를 사용하면 된다.

  • 메모리 사용량 확인을 위해서는 시스템의 cpu, 메모리, 디스크 정보를 확인할 수 있는 psutil 라이브러리와 os 라이브러리를 import 하여 메모리 사용량 확인을 위한 사용자 정의 함수를 별도로 정의해주었다.

📑메모리 사용량 측정 함수

import psutil
import os

# 메모리 사용량 측정 함수
def memory_usage():
    process = psutil.Process(os.getpid())
    return process.memory_info().rss / 1024 / 1024  # 메모리 사용량(MB 단위)

결론적으로 위의 세 가지 코드의 메모리 사용량은 약 38MB로 거의 비슷했다. 실행 시간은 코드를 실행시킬 때마다 실행 시간이 점점 짧아져, 즉 시간이 매번 바뀌어 정확한 시간은 알 수 없었지만 대략 10초 안팎이었다.

❓효율적인 알고리즘이란

처음에는 실행 시간이 짧은 코드가 효율적인 코드라고 생각했다. 하지만 실행 시간이 짧다고 해서 메모리 사용량이 적은 것만은 아니었다.

효율성은 코드의 알고리즘 복잡도, 메모리 사용량, 코드 가독성 등을 고려한 상대적인 평가이다.

  • 수행 시간 : 코드가 실제로 실행되었을 때 걸린 시간이므로 입력 크기, 시스템 성능, 메모리 관리 등 다양한 요인에 영향을 받음
  • 효율성 : 코드의 알고리즘적 설계에 기반한 평가로, 시간 복잡도가 낮고 메모리를 적게 사용하도록 최적화된 코드를 더 효율적이라고 볼 수 있음

이를 기반으로 위의 코드를 평가해본다면, min과 max 함수를 이용한 코드가 수행 시간은 가장 길게 나왔지만 리스트 사용한 코드와 if 조건문을 사용한 코드는 추가적인 메모리 사용과 cpu 연산을 사용하므로 min, max 함수를 사용한 코드가 가장 효율적인 코드가 아닐까 생각한다 . . . ! !

효율적인 알고리즘을 구분하기 위해서
파이썬의 메모리 구조 및 메모리 할당 과정에 대해 추가로 학습해보아야 할 것 같다 👌🏼👌🏼

profile
🐜👣steadiness🐜👣

0개의 댓글