파이썬 코딩테스트 강좌, 이진 탐색

1. 이진 탐색이란?

이진 탐색(Binary Search)은 매우 효율적인 탐색 알고리즘으로, 정렬된 배열에서 특정한 값을 찾는 데 사용됩니다. 이 알고리즘은 주어진 리스트를 절반으로 나누어가며 원하는 값을 검색하기 때문에, 일반적인 순차 탐색(Linear Search)보다 훨씬 빠른 성능을 보입니다.

이진 탐색의 핵심 아이디어는 리스트가 정렬되어 있다는 점을 활용하는 것입니다. 이 알고리즘은 다음과 같은 과정을 통해 작동합니다:

  1. 리스트의 중간 인덱스를 찾습니다.
  2. 중간 요소가 찾고자 하는 값과 일치하는지 확인합니다.
  3. 일치하지 않다면, 중간 요소와 찾고자 하는 값을 비교하여 탐색 범위를 조정합니다. 즉, 중간 요소보다 작으면 왼쪽 반쪽을, 크면 오른쪽 반쪽을 탐색합니다.
  4. 목표 값을 찾을 때까지 이 과정을 반복합니다.

2. 이진 탐색의 시간복잡도

이진 탐색 알고리즘의 시간복잡도는 O(log n)입니다. 이는 탐색할 목록의 크기가 n일 때, 각 단계에서 탐색 가능 영역을 반으로 줄이기 때문입니다. 이로 인해 이진 탐색은 매우 큰 데이터 세트에서도 효율적으로 작동하는 장점이 있습니다.

3. 문제: 특정 값의 인덱스 찾기

문제 설명

정렬된 정수 배열 arr와 정수 target이 주어질 때, target의 인덱스를 반환하는 이진 탐색 함수를 작성하시오. 만약 target이 존재하지 않는다면 -1을 반환해야 합니다.

입력

  • 첫 번째 줄에 배열의 크기 n이 주어진다. (1 ≤ n ≤ 10^5)
  • 두 번째 줄에 n개의 정수가 공백으로 구분되어 주어진다.
  • 세 번째 줄에 목표 값 target이 주어진다. (-10^9 ≤ target ≤ 10^9)

출력

target의 인덱스를 출력하시오. -1인 경우 target이 존재하지 않음을 의미합니다.

4. 문제의 입력 예시

                5
                1 2 3 4 5
                3
            

출력 예시

2

5. 문제 해결 과정

이 문제를 해결하기 위해 필요한 단계를 설명합니다. 이진 탐색 알고리즘을 사용하여 주어진 배열에서 target 값을 찾는 과정을 단계별로 진행하겠습니다.

5.1 알고리즘의 구현

먼저, 이진 탐색을 구현하기 위한 기본적인 구조를 정의합니다. 함수는 배열과 목표 값을 인자로 받고, 인덱스 또는 -1을 반환하도록 합니다. 이제 코드를 작성해 보겠습니다.

                def binary_search(arr, target):
                    left, right = 0, len(arr) - 1
                    
                    while left <= right:
                        mid = (left + right) // 2
                        
                        if arr[mid] == target:
                            return mid
                        elif arr[mid] < target:
                            left = mid + 1
                        else:
                            right = mid - 1
                    return -1
            

5.2 코드 설명

위의 코드는 간단한 이진 탐색 알고리즘의 구현입니다. leftright는 현재 탐색할 범위를 표시합니다. 기본적으로 left는 0, right는 배열의 마지막 인덱스입니다.

while left <= right: 라는 조건문은 leftright보다 작거나 같을 동안 반복합니다. 중간 값을 계산하여 mid에 저장하고, 그 값에 따라 조건을 체크하여 범위를 줄이는 방식으로 작동합니다.

5.3 입력 처리 및 출력

다음으로 입력을 처리하고, 작성한 binary_search 함수를 호출해 결과를 출력하는 부분을 추가하겠습니다.

                n = int(input())
                arr = list(map(int, input().split()))
                target = int(input())
                
                result = binary_search(arr, target)
                print(result)
            

6. 코드 최적화

위의 코드로는 기본적인 이진 탐색을 수행할 수 있지만, 코드를 조금 더 최적화할 수 있는 방법이 있습니다. 특히, Python에서는 리스트의 중간 인덱스를 계산할 때 더 간편한 방법을 사용할 수 있습니다. 처리를 단순화하기 위해, mid의 계산에서 각 값들을 직접 더하는 대신 Python의 정수 나눗셈을 사용하는 것이 좋습니다.

                def binary_search_optimized(arr, target):
                    left, right = 0, len(arr) - 1
                    
                    while left <= right:
                        mid = left + (right - left) // 2
                        if arr[mid] == target:
                            return mid
                        elif arr[mid] < target:
                            left = mid + 1
                        else:
                            right = mid - 1
                    return -1
            

이와 같이 mid를 계산함으로써 Python의 메모리에서 오버플로우를 방지할 수 있는 장점이 있습니다. 중간값의 계산을 더 안전하고 효율적으로 만드는 것입니다.

7. 다양한 변형 문제

이진 탐색 알고리즘은 특정한 값의 인덱스를 찾는 것 외에도 다양한 변형 문제에 적용될 수 있습니다. 예를 들어, 배열에서 가장 왼쪽(혹은 오른쪽) 인덱스 찾기, 특정 조건을 만족하는 최대(혹은 최소) 값 찾기 등의 문제가 있습니다.

7.1 예시 문제: 첫 번째 위치 찾기

주어진 정수 배열에서 특정 값의 첫 번째 위치를 찾는 문제를 해결해보겠습니다. 이를 해결하기 위해 이진 탐색을 사용하되, 만약 중간 값이 목표 값과 같을 경우 계속 왼쪽으로 탐색합니다.

                def binary_search_first(arr, target):
                    left, right = 0, len(arr) - 1
                    result = -1  # 결과 저장 변수
                    
                    while left <= right:
                        mid = left + (right - left) // 2
                        if arr[mid] == target:
                            result = mid     # 현재 인덱스를 저장
                            right = mid - 1  # 왼쪽 탐색
                        elif arr[mid] < target:
                            left = mid + 1
                        else:
                            right = mid - 1
                    return result
            

8. 결론

이진 탐색은 정렬된 배열에서 특정 값을 찾는데 매우 효율적인 알고리즘입니다. 본 강좌에서는 이진 탐색의 기본 개념, 시간 복잡도, 알고리즘 구현, 최적화 및 변형 문제에 대해 설명했습니다. 이진 탐색을 통해 코딩 테스트에서 자주 출제되는 문제를 효과적으로 해결할 수 있을 것입니다. 지속적으로 다양한 문제를 문제를 풀어보며, 이진 탐색을 활용한 기법들을 익히도록 하세요. 이를 통해 더 나은 코딩 실력을 쌓을 수 있을 것입니다.

앞으로도 더 많은 강좌와 문제 풀이를 통해 다양한 알고리즘을 배우시길 바랍니다. 알고리즘 문제는 반복적인 연습을 통해 실력을 향상시킬 수 있으니, 꾸준히 도전하는 자세를 가지시기 바랍니다.

파이썬 코딩테스트 강좌, 유클리드 호제법

안녕하세요. 이번 블로그 글에서는 알고리즘 시험과 실제 취업 과정에서 빈번히 등장하는 유클리드 호제법에 대해 자세히 알아보고, 이를 활용한 코딩 문제를 풀어보도록 하겠습니다.

1. 유클리드 호제법이란?

유클리드 호제법(Euclidean algorithm)은 두 정수의 최대공약수(GCD, Greatest Common Divisor)를 구하는 효율적인 방법으로, 고대 그리스의 수학자 유클리드가 처음으로 제안했습니다. 이 방법은 두 수의 나눗셈을 반복하면서 최대공약수를 찾는 방식으로 작동합니다.

유클리드 호제법의 원리

주어진 두 수 a, b (a > b)에 대해, GCD(a, b)는 GCD(b, a % b)와 같습니다. 이 과정을 b가 0이 될 때까지 반복하게 되며, 최종적으로 a가 최대공약수입니다.

예제

예를 들어, 48과 18의 최대공약수를 구해보겠습니다.

  1. GCD(48, 18) → GCD(18, 48 % 18) → GCD(18, 12)
  2. GCD(18, 12) → GCD(12, 18 % 12) → GCD(12, 6)
  3. GCD(12, 6) → GCD(6, 12 % 6) → GCD(6, 0)
  4. GCD(6, 0) = 6

2. 문제 정의

이제 유클리드 호제법을 바탕으로 한 알고리즘 문제를 정의해보겠습니다.

문제: 두 개의 정수를 입력받아 최대공약수를 출력하는 프로그램을 작성하시오.

입력: 두 개의 정수 A와 B (0 < A, B < 10^9)

출력: A와 B의 최대공약수 GCD(A, B)
    

3. 문제 풀이 과정

위 문제를 해결하기 위해 다음과 같은 일련의 과정을 거칠 것입니다.

3.1 문제 분석

우선 입력으로 두 개의 정수가 주어집니다. 이 두 수의 최대공약수를 찾는 것이 목표입니다. 주의할 점은 입력으로 주어지는 수의 범위가 상당히 크기 때문에, 알고리즘은 효율적이어야 합니다. 유클리드 호제법은 O(log(min(A, B)))의 시간복잡도를 가지므로 적합한 방법입니다.

3.2 알고리즘 설계

유클리드 호제법의 기본 재귀적 접근 방식을 사용하여 최대공약수를 구하도록 하겠습니다. 아래는 알고리즘의 주요 절차입니다.

  1. 함수를 정의하여 두 개의 정수를 인자로 받습니다.
  2. 두 수 중 큰 수와 작은 수를 비교하여, 큰 수를 작은 수로 나눈 나머지를 구합니다.
  3. 이때, 나머지가 0이 될 때까지 이 과정을 반복합니다.
  4. 나머지가 0이 되면, 그 때의 작은 수가 최대공약수입니다.

3.3 파이썬 코드 구현

def gcd(a, b):
    while b != 0:
        a, b = b, a % b
    return a

# 입력 처리
A, B = map(int, input("두 정수 A와 B를 입력하세요: ").split())
print("최대공약수는:", gcd(A, B))
    

위의 코드는 기본적인 유클리드 호제법을 사용하여 최대공약수를 계산합니다. 사용자가 입력한 두 수 A와 B를 받아, gcd 함수를 호출하여 결과를 출력합니다.

4. 복잡도 분석

유클리드 호제법의 시간복잡도는 O(log(min(A, B)))입니다. 이는 각 단계에서 두 수가 반으로 줄어들기 때문입니다. 이 알고리즘은 매우 효율적이며, 특히 큰 수에 대해서도 빠르게 동작합니다.

5. 다양한 변형 및 응용

유클리드 호제법은 단순히 최대공약수를 찾는 데에 그치지 않고, 다른 여러 문제를 해결하는 데에도 응용될 수 있습니다. 예를 들어:

  • 분수의 약분: 두 개의 정수를 인자로 받아 그 최대공약수로 분자를 나누고, 분모를 나누어 완전한 분수를 표현할 수 있습니다.
  • 최소공배수: 두 숫자의 곱을 최대공약수로 나누면 최소공배수를 계산할 수 있습니다.

6. 결론

이번 글에서는 유클리드 호제법에 대해 자세히 알아보았습니다. 알고리즘 시험에서 자주 등장하는 최대공약수를 구하는 문제를 통해, 이론과 실제 코드를 함께 공부할 수 있었던 좋은 기회였습니다. 여러분도 유클리드 호제법을 활용해 다양한 문제를 풀어보시기 바랍니다. Happy Coding!

이제, 더 많은 파이썬 관련 알고리즘 문제와 해결책에 대해 지속적으로 학습해보세요. 알고리즘을 마스터하는 것은 취업 준비의 중요한 요소이며, 여러 문제를 경험하는 것이 도움이 됩니다.

파이썬 코딩테스트 강좌, 유니온 파인드

안녕하세요! 이번 포스트에서는 유니온 파인드(Union-Find) 알고리즘에 대해 알아보고, 이를 활용한 알고리즘 문제를 풀이해 보도록 하겠습니다. 유니온 파인드는 서로소 집합을 관리하는데 매우 유용한 자료구조로, 여러 항목들의 연결 여부를 빠르게 판단하고 집합을 합치는 기능을 제공합니다.

유니온 파인드란?

유니온 파인드는 크게 두 가지 기능으로 구성됩니다:

  • Union: 두 원소가 속한 집합을 하나로 합치는 연산
  • Find: 특정 원소가 어느 집합에 속하는지 찾는 연산

이 두 운영을 통하여, 우리는 여러 요소 간의 관계를 쉽게 관리할 수 있으며, 복잡한 연결 문제를 효율적으로 해결할 수 있습니다. 특히, 그래프 문제나 네트워크 연결 문제에서 유용하게 사용됩니다.

유니온 파인드의 작동 원리

유니온 파인드는 주로 두 가지 기법을 사용하여 효율성을 극대화합니다:

1. 경로 압축(Path Compression)

Find 연산을 수행할 때, 경로를 압축하여 트리의 높이를 줄입니다. 이를 통해, 여러 번의 Find를 수행할 때 시간 복잡도를 감소시킬 수 있습니다.

2. Union by Rank

Union 연산 시 집합의 ‘랭크(높이)’를 고려하여, 더 낮은 랭크의 집합을 높은 랭크의 집합에 붙입니다. 이 방법 또한 트리의 깊이를 줄여 연산의 효율성을 높입니다.

문제: 연결 요소의 개수 구하기

다음과 같은 문제를 고려해 보세요:

주어진 n개의 노드와 m개의 간선이 있을 때, 서로 연결된 노드 집합의 개수를 구하시오. 노드는 0부터 n-1까지의 정수를 가지며, 간선 정보는 (a, b)의 형태로 주어진다.

입력 예시

    5 3
    0 1
    1 2
    3 4
    

출력 예시

    2
    

해결 과정

이 문제를 해결하기 위해 유니온 파인드 자료구조를 활용하여 각 노드의 관계를 정리할 것입니다. 아래 단계를 따라 진행하겠습니다:

1단계: 부모 배열 초기화

각 노드는 자기 자신을 부모로 가지는 상태로 초기화합니다. 즉, 부모 배열을 생성하고 각 노드가 자기 자신을 가리키도록 설정합니다.

    parent = [0, 1, 2, 3, 4]  # 노드 수에 맞춰 초기화
    

2단계: Union 연산 수행

주어진 간선 정보를 기반으로 Union 연산을 통해 노드들을 연결합니다. 이를 통해 서로 연결된 집합을 하나로 묶습니다.

3단계: Find 연산을 통해 연결된 집합 카운팅

각 노드에 대해 Find 연산을 수행하여 어떤 집합에 속하는지를 확인하고, 유일한 루트 노드의 개수를 센 후 결과를 출력합니다.

구현

이제 위의 과정들을 파이썬 코드로 구현해 보겠습니다.

    class UnionFind:
        def __init__(self, size):
            self.parent = list(range(size))
            self.rank = [1] * size
        
        def find(self, p):
            if self.parent[p] != p:
                # 경로 압축
                self.parent[p] = self.find(self.parent[p])
            return self.parent[p]
        
        def union(self, p, q):
            rootP = self.find(p)
            rootQ = self.find(q)
            
            if rootP != rootQ:
                # Union by rank
                if self.rank[rootP] > self.rank[rootQ]:
                    self.parent[rootQ] = rootP
                elif self.rank[rootP] < self.rank[rootQ]:
                    self.parent[rootP] = rootQ
                else:
                    self.parent[rootQ] = rootP
                    self.rank[rootP] += 1

    # 사용 예제
    def count_connected_components(n, edges):
        uf = UnionFind(n)
        
        # 간선 정보로 Union 수행
        for u, v in edges:
            uf.union(u, v)
        
        # 유일한 루트의 수를 세어 연결 구성 요소의 개수를 반환
        root_set = set(uf.find(i) for i in range(n))
        return len(root_set)

    # 입력 처리
    n = 5
    edges = [(0, 1), (1, 2), (3, 4)]
    print(count_connected_components(n, edges))  # 출력: 2
    

결과 해석

위 코드를 실행하면 2라는 결과가 출력됩니다. 이는 주어진 그래프에서 서로 연결된 노드 집합이 두 개 존재함을 의미합니다.

시간 복잡도 분석

유니온 파인드를 사용했을 때, 각 운영의 시간 복잡도는 거의 O(α(n))에 가까워지며, 여기서 α는 아커만 함수의 역함수입니다. 이는 매우 느리게 증가하는 함수이므로, 실제로는 상수에 가까운 시간을 소요한다고 볼 수 있습니다.

마무리

이번 포스트에서는 유니온 파인드 자료구조와 이를 활용한 문제 해결 방법을 살펴보았습니다. 유니온 파인드를 통해 복잡한 연결 문제를 효율적으로 해결할 수 있음을 확인했는데요, 다양한 응용을 해보며 연습해 보시기 바랍니다.

감사합니다!

파이썬 코딩테스트 강좌, 원하는 정수 찾기

안녕하세요! 이번 강좌에서는 ‘원하는 정수 찾기’라는 알고리즘 문제를 함께 풀어보겠습니다. 이 문제는 n개의 정수로 이루어진 리스트에서 특정 정수를 찾는 문제입니다. 이 과정에서 기본적인 알고리즘 및 데이터 구조에 대해 알아보는 시간을 가질 것입니다. 문제 설정과 함께 해결 방안을 단계별로 설명하겠습니다.

문제 설명

주어진 정수 리스트 nums와 정수 target이 있을 때, target이 리스트 nums에 존재하는 인덱스를 반환하는 함수를 작성하세요. 만약 target이 리스트에 존재하지 않으면 -1을 반환합니다.

입력 예시

  • nums = [2, 5, 1, 8, 3], target = 8 => 반환값: 3
  • nums = [2, 5, 1, 8, 3], target = 4 => 반환값: -1

문제 접근 방법

이 문제를 해결하기 위해 우리는 두 가지 접근 방식을 고려할 수 있습니다: 선형 검색과 이진 검색입니다. 두 방법은 각각의 장단점이 있으며, 성능을 비교해보는 것도 좋은 학습이 될 것입니다.

1. 선형 검색

선형 검색은 리스트를 처음부터 끝까지 순차적으로 탐색하면서 target을 찾는 방법입니다. 시간 복잡도는 O(n)입니다.

선형 검색 구현

def linear_search(nums, target):
    for index in range(len(nums)):
        if nums[index] == target:
            return index
    return -1

위 코드에서 for 루프는 리스트의 각 요소를 하나씩 확인합니다. target과 같은 요소를 찾으면 해당 인덱스를 반환하며, 리스트의 끝까지 탐색해도 찾지 못하면 -1을 반환합니다.

2. 이진 검색

이진 검색은 정렬된 리스트에서 사용할 수 있는 효율적인 검색 방법입니다. 리스트를 중간값과 비교하며 검색 범위를 절반으로 줄여나갑니다. 시간 복잡도는 O(log n)입니다. 따라서 이 방법은 검색 효율성이 중요한 경우 유용합니다.

이진 검색 구현

def binary_search(nums, target):
    left, right = 0, len(nums) - 1
    while left <= right:
        mid = (left + right) // 2
        if nums[mid] == target:
            return mid
        elif nums[mid] < target:
            left = mid + 1
        else:
            right = mid - 1
    return -1

위의 이진 검색 구현에서는 leftright 변수를 사용하여 리스트의 검색 범위를 조정합니다. 매 루프마다 중간값을 계산하고, 이 값과 target을 비교하여 검색 범위를 조정합니다.

문제 해결 과정

이제 주어진 문제를 해결하기 위해 두 개의 접근 방식을 모두 구현하고, 성능을 비교해보겠습니다.

성능 비교

선형 검색과 이진 검색의 성능을 비교하기 위해, 각 검색 알고리즘을 일정한 크기의 리스트 데이터에 대해 수행해보겠습니다. 다음은 성능 비교를 위한 테스트 코드입니다.

import random
import time

# 데이터 생성
size = 1000000
nums = sorted(random.sample(range(1, 10000000), size))
target = random.choice(nums)

# 선형 검색 성능 테스트
start_time = time.time()
print("Linear Search Result: ", linear_search(nums, target))
print("Linear Search Time: ", time.time() - start_time)

# 이진 검색 성능 테스트
start_time = time.time()
print("Binary Search Result: ", binary_search(nums, target))
print("Binary Search Time: ", time.time() - start_time)

위 코드를 실행하면 두 검색 알고리즘의 수행 시간과 결과를 확인할 수 있습니다. 대체로 이진 검색이 더 빠른 성능을 보일 것입니다.

결론

이번 강좌에서는 ‘원하는 정수 찾기’ 문제를 선형 검색과 이진 검색 두 가지 방법으로 해결해보았습니다. 각각의 알고리즘이 어떻게 작동하는지, 그리고 어떤 상황에서 사용해야 하는지에 대해 알아보았으니, 실제 코딩 테스트나 알고리즘 문제 풀이에 있어 큰 도움이 될 것입니다.

앞으로도 다양한 알고리즘 문제를 통해 코딩 능력을 향상시켜 나가시길 바랍니다. 감사합니다!

파이썬 코딩테스트 강좌, 위상 정렬

위상 정렬(Topological Sorting)은 Directed Acyclic Graph (DAG, 방향성이 있는 비순환 그래프)에서 노드들을 정렬하는 방법입니다. 모든 간선이 의 노드에서 아래의 노드로 향하는 순서로 배열 하는 것입니다. 이 정렬은 주로 작업의 수행 순서나, dependency(의존성) 및 다양한 프로그래밍 문제에서 사용됩니다.

문제 설명

주어진 수업 개수 N과 각 수업 간의 선후 관계를 나타내는 edges 리스트가 있습니다. 수업을 들을 수 있는 순서를 위상 정렬 알고리즘을 사용하여 구하는 문제입니다.

입력 형식

N = 6
edges = [(2, 1), (3, 1), (4, 1), (6, 4), (5, 2), (5, 3)]

출력 형식

1 2 3 4 5 6 (수업을 들을 수 있는 한 가지 순서)

문제 풀이 과정

1. 문제 이해하기

위상 정렬 문제는 주어진 노드들(N)과 간선 정보(edges)를 통해 선후 관계를 정립한 후, 모든 노드를 정렬하는 것입니다. 여기서 edges는 (A, B) 형태로 표현되며, A를 먼저 들어야 B를 들을 수 있음을 의미합니다.

2. 입력 파라미터 처리

위상 정렬을 구현하기 위해 우선 그래프의 인접리스트 및 진입 차수 배열을 구성해야 합니다. 진입 차수 배열은 각 노드가 들어야 할 수업의 수를 카운트합니다.

from collections import deque

def topological_sort(N, edges):
    # 그래프와 진입차수 초기화
    graph = [[] for _ in range(N + 1)]
    in_degree = [0] * (N + 1)
    
    # 간선 정보를 그래프와 진입차수에 등록
    for u, v in edges:
        graph[u].append(v)
        in_degree[v] += 1

3. 위상 정렬 알고리즘 설계

이제, 위상 정렬을 수행하기 위한 알고리즘을 설계하겠습니다. 진입 차수가 0인 노드를 큐(Queue)에 추가하고, 큐에서 노드를 하나씩 꺼내면서 그 노드와 연결된 다른 노드들의 진입 차수를 감소시킵니다. 감소 후 진입 차수가 0이 되는 노드는 다시 큐에 추가됩니다. 이 과정을 큐가 빌 때까지 반복합니다. 최종적으로는 정렬된 노드의 순서를 반환합니다.

    # 진입차수가 0인 노드를 큐에 추가
    queue = deque()
    for i in range(1, N + 1):
        if in_degree[i] == 0:
            queue.append(i)

    result = []
    
    while queue:
        current = queue.popleft()
        result.append(current)
        
        for neighbor in graph[current]:
            in_degree[neighbor] -= 1
            if in_degree[neighbor] == 0:
                queue.append(neighbor)

    return result

4. 전체 코드 작성 및 실행

이제 전체 코드를 통합하여 최종 코드를 작성하겠습니다. 처리한 입력값을 함수에 전달하여 결과를 확인할 수 있습니다.

N = 6
edges = [(2, 1), (3, 1), (4, 1), (6, 4), (5, 2), (5, 3)]

sorted_order = topological_sort(N, edges)
print("수업을 들을 수 있는 순서:", sorted_order)

5. 결과 및 평가

위 코드를 실행하면 위상 정렬을 통해 수업을 들을 수 있는 순서를 구할 수 있습니다. 이 과정에서 그래프의 성질에 따라 여러 개의 올바른 정답이 나올 수 있습니다. 따라서 알고리즘이 올바르게 작동했다면 결과의 유효성을 폭넓게 검증할 필요가 있습니다.

6. 코드 및 알고리즘 최적화

위상 정렬 알고리즘의 시간 복잡도는 O(V + E)입니다. 여기서 V는 정점(vertex)의 수, E는 간선(edge)의 수입니다. 이 알고리즘은 대규모 데이터셋에서도 효율적으로 동작할 수 있기 때문에 취업 코딩테스트에 유용한 도구가 될 수 있습니다.

결론

위상 정렬은 그래프 이론에서 유용하게 사용되는 알고리즘으로, 다양한 문제에 응용될 수 있습니다. 이번 강좌에서는 파이썬을 이용해 위상 정렬을 구현해보았고, 실전 코딩테스트에 적합한 내용을 제공하였습니다. 앞으로도 이러한 알고리즘 문제를 깊이 있게 이해하고 활용하시길 바랍니다.

참고 자료