개인공부/알고리즘

알고리즘 문제 풀이(최대값, 최소값, 재귀호출, 최대공약수, 피보나치)

lsc99 2023. 9. 17. 12:57
# 1번
# 1부터 n까지 연속 숫자 합 (첫 번째 방법) -> O(n)
def sum_n(n):
    sum = 0
    
    for i in range(1, n+1):
        sum += i
        
    return sum
    
# 1부터 n까지 연속 숫자 합 (두 번째 방법) -> O(1)
def sum_n2(n):
    sum = (n * (n + 1))/2
    
    return sum

 

sum_n(3) # 1

sum_n2(3) # 2

 

# 1-1번
# 1부터 n까지 연속한 숫자의 제곱의 합을 구하는 프로그램(for 문) (첫 번째 방법)-> O(n)
def mul_sum_n(n):
    sum = 0
    
    for i in range(1, n+1):
        sum += i ** 2
        
    return sum

# 1부터 n까지 연속한 숫자의 제곱의 합을 구하는 프로그램 (두 번째 방법)-> O(1)
def mul_sum_n2(n):
    sum = (n * (n + 1) * (2 * n + 1)) / 6
    
    return sum

 

mul_sum_n(4)

mul_sum_n2(4)

# 2번
# 최댓값 찾기 -> O(n)
def find_max(list):
    max_value = 0
    
    for i in list:
        if i > max_value:
            max_value = i
    
    return max_value

# 최댓값 위치 번호 찾기 -> O(n)
def find_max_idx(list):
    max_value_idx = 0
    
    for i in range(1, len(list)):
        if list[i] > list[max_value_idx]:
            max_value_idx = i
    
    return max_value_idx

 

find_max([17, 98, 22, 33, 58, 92, 66, 101, 50])

find_max_idx([17, 98, 22, 33, 58, 92, 66, 101, 50])

 

# 2-1번
# 숫자 n개를 입력받아(list) 최솟값을 구하는 프로그램

def l_min_value():
    l = []
    while True:
        value = input('숫자를 입력하세요. q 입력시 종료')
        if value == 'q':
            break
        else:
            l.append(value)
        

    min_value = l[0]
    
    for i in range(1, len(l)):
        if l[i] < min_value:
            min_value = l[i]
    
    return min_value

 

l_min_value()

# 3번
# 두 번 이상 나온 이름 찾기 -> O(n^2)
def find_same_name(list):
    result_list = []
    for i in range(0, len(list)-1):
        for j in range(i+1, len(list)):
            if list[i] == list[j]:
                print(list[i])
                result_list.append(list[j])
                
    return result_list

 

find_same_name(["TOM", "JERRY", "TOM", "ASDFG", "JERRY"])

 

# 3-1번
# n명 중 두명을 뽑아 짝을 짓는다고 할 때, 짝을 지을 수 있는 모든 조합을 출력하는 알고리즘을 만들기
def a(list):
    for i in range(0, len(list)):
        for j in range(i+1, len(list)):
            print(list[i], list[j])

 

a(["tom", "jerry", "kim", "lee"])

# 4번
# 팩토리얼(factorial) 구하기 -> O(n)
def factorial(n):
    result = 1
    for i in range(1, n+1):
        result *= i 
    return result

 

factorial(5)

 

# 4번
# 팩토리얼(factorial) 구하기 (재귀호출(recursion) 알고리즘) -> O(n)
def fact_re(n):
    if n <= 1:
        return 1
    return n * fact_re(n-1)

 

fact_re(6)

 

# 4-1번
# 1부터 n까지 연속 숫자 합 (재귀호출)
def sum_re(n):
    sum = 0
    
    if n <= 0:
        return sum
    return n + sum_re(n-1)

 

sum_re(10)

 

# 4-2번
# 최댓값 찾기 (재귀호출)
def find_max_re(list, n):
    if n == 1:
        return list[0]
    else:
        return max(list[n-1], find_max_re(list, n-1))

 

find_max_re([1,2,3,5,8,6,11], 7)

# 5번 문제
# 최대공약수

def gcd(num1, num2):
    i = min(num1, num2)
    
    while True:
        if num1 % i == 0 and num2 % i == 0:
            return i
        i = i - 1

 

gcd(60, 24)

 

# 5번 문제
# 최대공약수 - 유클리드 방식
def gcd(num1, num2):
    print(num1,num2)
    if num2 == 0:
        return num1
    return gcd(num2, num1 % num2)

 

gcd(60,24)

 

# 5-1번 문제
# 피보나치 수열
def fibo(n):
    if n == 1:
        return 1
    if n == 2:
        return 1
    else:
        return fibo(n-1) + fibo(n-2)

 

fibo(7)