5 분 소요

실습 1

# 2116313 손수경
# 1번을 해보세요!
def insertion_sort(A):
    for i in range(1, len(A)):
        key = A[i]
        j = i - 1
        while j >= 0 and A[j] > key:
            A[j + 1] = A[j]
            j = j - 1
        A[j + 1] = key
        printStep(A, i)

# 중간 과정을 출력하는 함수에요!


def printStep(arr, val):
    print("  Step %2d = " % val, end='')
    print(arr)


# 2번을 해보세요!
data = [int(i) for i in input().split()]

# 출력합니다!
print("Original  :", data)
insertion_sort(data)
print("Insertion :", data)

실습 2

# 2116313 손수경
# 1번을 해보세요!
def topological_sort(graph):
    inDeg = {}
    # 차수 setting
    for v in graph:
        inDeg[v] = 0
    for v in graph:
        for u in graph[v]:
            inDeg[u] += 1

    # 차수가 0인 리스트 setting
    vList = []
    for v in graph:
        if inDeg[v] == 0:
            vList.append(v)

    while len(vList) != 0:
        v = vList.pop()
        print(v, end=' ')
        for u in graph[v]:
            inDeg[u] -= 1
            if inDeg[u] == 0:
                vList.append(u)


# 2번을 해보세요!
mygraph = dict()
n1 = int(input())
for i in range(n1):
    mygraph.setdefault(chr(ord('A') + i), set())

n2 = int(input())
for i in range(n2):
    a, b = input().split()
    mygraph[a] |= {b}


# 출력합니다!
print('topological_sort: ')
topological_sort(mygraph)
print()

실습 3 :: 이진 탐색(순환구조)

# 2116313 손수경
# 1번을 해보세요1
def binary_search(A, key, low, high):
    mid = (low + high) // 2
    if key == A[mid]:
        return mid
    elif key < A[mid]:
        high = mid - 1
    else:
        low = mid + 1
    return -1


# 2번을 해보세요!
listA = [int(i) for i in input().split()]
key = int(input())

# 출력합니다!
print("입력 리스트 =", listA)
print("%d 탐색(순환) -->" % (key), binary_search(listA, key, 0, len(listA)-1))

60점?
내가 한 방법은 순환 구조와 반복 구조를 섞은 방식이다. 만약 반복문을 사용하고 싶지 않다면 조건문 밑에 return binary_search(A, key, low, high) 를 넣어주면 된다.

# 2116313 손수경
# 1번을 해보세요1
def binary_search(A, key, low, high):
    while low <= high:
        mid = (low + high) // 2
        if key == A[mid]:
            return mid
        elif key < A[mid]:
            high = mid - 1
        elif key > A[mid]:
            low = mid + 1
    return -1


# 2번을 해보세요!
listA = [int(i) for i in input().split()]
key = int(input())

# 출력합니다!
print("입력 리스트 =", listA)
print("%d 탐색(순환) -->" % (key), binary_search(listA, key, 0, len(listA)-1))

아 근데 이 방법은 반복 구조이므로 실습 4번에 복붙,,,

# 2116313 손수경
# 1번을 해보세요1
def binary_search(A, key, low, high):
    if low <= high:
        mid = (low + high) // 2
        if key == A[mid]:
            return mid
        elif key < A[mid]:
            return binary_search(A, key, low, mid - 1)
        elif key > A[mid]:
            return binary_search(A, key, mid + 1, high)

    return -1


# 2번을 해보세요!
listA = [int(i) for i in input().split()]
key = int(input())

# 출력합니다!
print("입력 리스트 =", listA)
print("%d 탐색(순환) -->" % (key), binary_search(listA, key, 0, len(listA)-1))

실습 4 :: 이진 탐색(반복구조)

# 2116313 손수경
# 1번을 해보세요1
def binary_search(A, key, low, high):
    while low <= high:
        mid = (low + high) // 2
        if key == A[mid]:
            return mid
        elif key < A[mid]:
            high = mid - 1
        elif key > A[mid]:
            low = mid + 1
    return -1


# 2번을 해보세요!
listA = [int(i) for i in input().split()]
key = int(input())

# 출력합니다!
print("입력 리스트 =", listA)
print("%d 탐색(반복) -->" % (key), binary_search(listA, key, 0, len(listA)-1))

실습 5 :: 거듭제곱(억지 기법)

# 2116313 손수경
# 1번을 해보세요!
def slow_power(x, n):
    for i in range(n - 1):
        x *= x
    return x


# 2번을 해보세요!
x = float(input())
n = int(input())

# 출력합니다!
print("억지기법(%d**%d) =" % (x, n), slow_power(x, n))

처음에 이렇게 했는데 왜 틀린거지?

# 2116313 손수경
# 1번을 해보세요!
def slow_power(x, n):
    result = 1.0
    for i in range(n):
        result *= x
    return result


# 2번을 해보세요!
x = int(input())
n = int(input())

# 출력합니다!
print("억지기법(%d**%d) =" % (x, n), slow_power(x, n))

실습 6 :: 거듭제곱(축소 정복 기법)

-> 순환 구조로 하란다.

# 2116313 손수경
# 1번을 해보세요!
def power(x, n):
    # 순환 구조로
    if n == 0:
        return 1
    elif n % 2 == 0:
        return power(x * x, n // 2)
    else:
        return power(x * x, (n - 1) // 2)


# 2번을 해보세요!
x = int(input())
n = int(input())

# 출력합니다!
print("축소정복기법(%d**%d) =" % (x, n), power(x, n))

60점.
아! 왜냐면 n이 홀수인 경우 마지막에 x 한번 더 곱해주어야 된다.

실습 7 :: 행렬의 거듭제곱(축소 정복 기법) | p.163

# 2116313 손수경
# 1번을 해보세요!
def powerMat(x, n):
    if n == 1:
        return x
    elif n % 2 == 0:
        return powerMat(multMat(x, x), n // 2)
    else:
        return multMat(x, powerMat(multMat(x, x), (n - 1) // 2))


# 행렬을 곱하는 multMat(M1, M2) 함수에요!
def multMat(M1, M2):
    result = [[0 for _ in range(len(M2[0]))] for __ in range(len(M1))]
    for i in range(len(M1)):
        for j in range(len(M2[0])):
            for k in range(len(M1[0])):
                result[i][j] += M1[i][k] * M2[k][j]
    return result


# 2번을 해보세요!
n = int(input())
row_col = int(input())
x = [[int(i) for i in input().split()] for i in range(row_col)]

# 출력합니다!
result = powerMat(x, n)
print()
for row in result:
    for num in row:
        print(num, end=' ')
    print()

실습 8 :: 정렬을 이용한 k번째 작은 수 찾기 | p.165

# 2116313 손수경
# 1번을 해보세요!
def kth_smallest_sort(A, k):
    A.sort()

    return A[k - 1]


# 2번을 해보세요!
array = [int(i) for i in input().split()]
k = int(input())


# 출력합니다!
print("입력 리스트 =", array)
print("[정렬기법] %d번째 작은 수: " % (k), kth_smallest_sort(array, k))

실습 9 :: 축소 정복 기법을 이용한 k번째 작은 수 찾기 | p.168

# 2116313 손수경
# 1번을 해보세요!
def quick_select(A, left, right, k):
    pos = partition(A, left, right)

    if pos + 1 == left + k:
        return A[pos]
    elif pos + 1 > left + k:
        return quick_select(A, left, pos - 1, k)
    elif pos + 1 < left + k:
        return quick_select(A, pos + 1, right, k - (pos + 1 - left))

# 2번을 해보세요!


def partition(A, left, right):
    low = left + 1
    high = right
    pivot = A[left]
    while low <= high:
        while low <= right and pivot >= A[low]:
            low += 1
        while high >= left and pivot < A[high]:
            high -= 1
        if low < high:
            A[low], A[high] = A[high], A[low]
    A[left], A[high] = A[high], A[left]
    return high


# 3번을 해보세요!
array = [int(i) for i in input().split()]
k = int(input())

# 출력합니다!
n = len(array)
print("입력 리스트 =", array)
print("[축소정복] %d번째 작은 수: " % (k), quick_select(array, 0, n-1, k))

댓글남기기