분할정복법 문제

강정우·2022년 7월 30일
0

algorithm

목록 보기
6/28
post-thumbnail

1. 가장 가까운 값 찾기

import sys

def getNearestInternal(data, m):
    '''
    m과 가장 가까운 값 후보인 두 값을 리턴하는 함수.
    '''
    
    if len(data) == 1:
        return (data[0], data[0])
    elif len(data) == 2:
        return (data[0], data[1])

    mid = len(data)//2

    if data[mid] <= m:
        return getNearestInternal(data[mid:],m)

    else:
        return getNearestInternal(data[:mid+1],m)
    
    return(0, 0)

def getNearest(data, m) :
    '''
    n개의 숫자가 list로 주어지고, 숫자 m이 주어질 때, n개의 숫자 중에서 m과 가장 가까운 숫자를 반환하는 함수를 작성하세요.

    가장 가까운 값 후보인 두 값을 찾고, 더 가까운 것 반환
    '''
    value = getNearestInternal(data, m)

    '''
    value[0] : m 이하이면서 가장 가까운 값
    value[1] : m 이상이면서 가장 가까운 값
    '''

    if m-value[0] <= value[1]-m:
        return value[0]
    else:
        return value[1]

    return 0

def main():
    '''
    이 부분은 수정하지 마세요.
    '''

    data = [int(x) for x in input().split()]
    m = int(input())

    print(getNearest(data, m))

if __name__ == "__main__":
    main()

2. 거듭제곱 구하기

LIMIT_NUMBER = 1000000007

def getPower(m, n):
    '''
    m^n 을 LIMIT_NUMBER로 나눈 나머지를 반환하는 함수를 작성하세요.
    '''

    # 항상 기저조건 부터
    if n == 0:
        return 1
    elif n%2 == 0:
        temp = getPower(m, n//2)
        return (temp*temp) %LIMIT_NUMBER
    else:
        temp = getPower(m, (n-1)//2)
        return (temp*temp*m) % LIMIT_NUMBER

def main():
    '''
    이 부분은 수정하지 마세요.
    '''

    myList = [int(v) for v in input().split()]

    print(getPower(myList[0], myList[1]))

if __name__ == "__main__":
    main()

3. 합병정렬

import sys
import math

def mergeSort(data) :
    '''
    n개의 숫자를 합병정렬을 이용하여 정렬한 결과를 list로 반환하는 함수를 작성하세요.
    '''

    # 기저조건
    if len(data) == 1:
        return data

    mid = len(data)//2

    left = mergeSort(data[:mid])
    right = mergeSort(data[mid:])
    
    result = []

    leftPtr = 0
    rightPtr = 0

    while leftPtr < len(left) or rightPtr < len(right):
        leftValue = left[leftPtr] if leftPtr < len(left) else math.inf
        rightValue = right[rightPtr] if rightPtr < len(right) else math.inf

        if leftValue < rightValue:
            result.append(leftValue)
            leftPtr += 1
        else:
            result.append(rightValue)
            rightPtr += 1

    return result

def main():
    '''
    이 부분은 수정하지 마세요.
    '''

    data = [int(x) for x in input().split()]

    print(*mergeSort(data))

if __name__ == "__main__":
    main()

4. 연속부분최대합(어려움)

import sys

def getSubsum(data) :
    '''
    n개의 숫자가 list로 주어질 때, 그 연속 부분 최대합을 반환하는 함수를 작성하세요.
    '''

    n = len(data)

    if n ==1 :
        return data[0]

    '''
    왼쪽, 오른쪽, 양쪽
    '''

    mid = n//2

    left = getSubsum(data[:mid])
    right = getSubsum(data[mid:])

    # 양쪽에 걸치는 경우
    Sum = 0

    leftSum = 0
    rightSum = 0

    # 왼쪽에 걸치는 가장 큰 경우의 부분 합
    for i in range(mid-1, -1, -1):
        Sum += data[i]
        leftSum = max(Sum, leftSum)

    Sum =0

    # 오른쪽에 걸치는 가장 큰 경우의 부분 합
    for i in range(mid, n):
        Sum += data[i]
        rightSum = max(Sum, rightSum)

    return max([left, right, leftSum + rightSum])

def main():
    '''
    이 부분은 수정하지 마세요.
    '''

    data = [int(x) for x in input().split()]

    print(getSubsum(data))

if __name__ == "__main__":
    main()
profile
智(지)! 德(덕)! 體(체)!

0개의 댓글

관련 채용 정보