728x90

Python 119

백준 1647 <도시 분할 계획> Python

https://www.acmicpc.net/problem/1647최소 스패닝 트리 문제입니다.우선 모든 마을이 연결되게 하는 최소 코스트를 구한 뒤 가장 코스트가 큰 길을 지우면 코스트 합이 가장 작은 두 개의 마을이 됩니다.import sysinput = sys.stdin.readline# 크루스칼 알고리즘을 위한 Union-Find# Uniondef Union(root_list, node_1, node_2):    # 각 노드의 루트    root_1 = Find(root_list, node_1)    root_2 = Find(root_list, node_2)    # 각 루트가 같으면    if root_1 == root_2:        return False    # 다르면 루트가 작은쪽으로 병..

백준 1197 <최소 스패닝 트리> Python

https://www.acmicpc.net/problem/1197말 그대로 최소 스패닝 트리 문제입니다.크루스칼 알고리즘을 통해 쉽게 풀 수 있습니다.다만 recursion error 가 발생할 때에는 연결된 엣지의 수가 N-1 을 초과하지 않았는지 체크해주면 됩니다. import sysinput = sys.stdin.readline# 크루스칼 알고리즘을 위한 Union-Find# Uniondef Union(root_list, node_1, node_2):    # 각 노드의 루트    root_1 = Find(root_list, node_1)    root_2 = Find(root_list, node_2)    # 각 루트가 같으면    if root_1 == root_2:        return F..

백준 2467 <용액> Python

https://www.acmicpc.net/problem/2467용액의 입력은 정렬되어 있다는 점을 활용해 투포인터로 풀 수 있습니다. l 값은 증가할수록 합이 증가하고r 값은 감소할수록 합이 감소합니다. 합이 0 보다 크면 합을 줄여야 하므로 r 값을 감소시키고합이 0 보다 작으면 합을 늘여야 하므로 l 값을 증가시키면 됩니다.import sysinput = sys.stdin.readlinedef solution(fluids):    ## 투포인터    l = 0    r = len(fluids)-1    # 최소 절댓값    min_abs_sum_nums = float('inf')    # 합이 0 이거나 두 포인터가 교차할 때 까지    while l r:        # 합        sum_..

백준 2787 <흔한 수열 문제> Python

https://www.acmicpc.net/problem/2787 '수열의 특정 인덱스에 특정한 수들이 들어갈 수 있고 가능한 많은 수를 인덱스에 배치해라'즉 흔한 이분매칭 문제입니다. 다만 헷갈릴 수 있는 부분이 있다면'[x, y] 구간의 최대/최솟값이 v 이다' 라는 말은 [x, y] 구간에 v 가 꼭 존재해야 한다는 말입니다.또 나머지 구간에는 v 가 존재할 수 없다는 말과 같습니다.  이를 신경써서 항상 이분매칭을 풀던 것 처럼 노드 -> 노드 연결 가능성만 체크해주면 됩니다.import sysinput = sys.stdin.readline# 이분매칭def bimatch(idx, range_list, connected, visited, excluded_idxs):    # 이미 방문한 노드면 탐색..

백준 2191 <들쥐의 탈출> Python

https://www.acmicpc.net/problem/2191이분매칭 문제입니다.단순하게 연결된 노드만 구해준다면 기본적인 이분매칭입니다.import sysfrom math import sqrtinput = sys.stdin.readline# 이분매칭def bimatch(idx, connectable, connected, visited):    # 이미 방문한 노드면 탐색 안함    if visited[idx]:        return False    # 방문 체크    visited[idx] = True    # 탐색 가능한 노드 탐색    for node in connectable[idx]:        # 연결할 수 있거나 연결된 노드를 다른 노드로 옮길 수 있다면        if conne..

백준 3295 <단방향 링크 네트워크> Python

https://www.acmicpc.net/problem/3295해당 문제는 이분매칭으로 풀 수 있는 문제입니다.이분매칭 문제는 보통 왜 이분매칭으로 풀 수 있는지 이해하는게 어렵습니다. 문제에서 보면 선형 배열은 K-1 의 가치를, 링은 K 의 가치를 갖습니다.그런데 이 수치는 해당 배열과 링이 갖고있는 노드의 수와 같음을 알 수 있습니다.결국 해당 문제는 '노드끼리 가장 많이 연결할 수 있는 경우를 찾아라' 를 요구하고 있습니다. 또 선형배열과 링은 하나의 노드 안에 들어가는 엣지와 나가는 엣지가 모두 하나 이하로 존재합니다. 즉 연결된 모든 노드는 1 대 1 매칭이 된다는 말입니다. 정리해보자면 '노드를 연결할 건데 모든 노드끼리는 1 대 1로 매칭이 되고 해당 조건 아래에서 가장 노드를 많이 연결..

백준 11378 <열혈강호 4> Python

https://www.acmicpc.net/problem/11378https://dev-diary-0717.tistory.com/176기존에 포스팅한 열혈강호 3 과 같은 문제라고 볼 수 있습니다.다만 달라진 점은 한 사람이 추가로 담당할 수 있는 일이 1 개가 아닌 K 개가 된 것인데 추가 노드에서 직원 노드로 간선을 만들 때 흐를 수 있는 유체의 양을 K 로 설정하면 K 번 모두 탐색을 하며 최대치까지 부여하기 때문에 해결됩니다.import sysfrom collections import deque, defaultdictinput = sys.stdin.readlinedef solution(N, M, K, hope_list):    # 흐를수 있는 유체의 양    flowable = defaultdic..

백준 11377 <열혈강호 3> Python

https://www.acmicpc.net/problem/11377열혈강호 2 까지는 이분매칭으로 풀었지만 해당 문제는 네트워크 플로우 알고리즘 중 에드몬드 카프 알고리즘으로 풀었습니다.아마 2 개의 일을 할 수 있는 K명을 정하는데 큰 지장이 있을 것이라고 생각합니다.모두 두 개씩 일을 할 수 있을 때 (열혈강호 2) 이분 매칭을 두 번 돌렸던 것을 생각해 우선 모두에게 일을 하나씩 되는대로 할당하고 추가적으로 일을 할당하는 방식으로 진행했습니다. 문제에서 제시한 예제를 그래프로 만들면 이렇게 됩니다.해당 그래프에서 이동하는 경로는 0 - 1 - 6 - 120 - 2 - 7 - 120 - 3 - 10 - 120 - 11 - 1 - 8 - 12 으로 우선 모든 직원들에게 일을 할당한 뒤 추가 노드에서 일..

백준 1671 <상어의 저녁식사> Python

https://www.acmicpc.net/problem/1671유명한 이분매칭 문제입니다.살아남을 수 있는 상어수의 최솟값을 구하라는 말은 가장 많이 잡아먹힌 케이스를 구하라는 말과 같고 최대한 많이 매칭하라는 말과 같으므로 이분매칭으로 풀 수 있습니다. 한 마리의 상어가 두 마리 까지 잡아먹을 수 있다는 점에서https://dev-diary-0717.tistory.com/172의 열혈강호 2 와 비슷한 문제입니다.이번에는 포스팅한 방식이 아닌 그저 이분매칭을 두 번 돌리는 방식으로 풀었습니다.또 주의해야 할 케이스가 서로를 잡아먹는 케이스인데, visited 를 조작하는 방식보다는 데이터를 서로 잡아먹을 수 없게 만들어놓는 것이 보다 편합니다.import sysinput = sys.stdin.read..

백준 1017 <소수 쌍> Python

https://www.acmicpc.net/problem/1017소수 체크와 이분매칭을 합쳐놓은 문제입니다.우선 각 리스트의 요소에서 더하면 소수가 되는 목록을 만들어 노드간의 연결을 구해줍니다.그 뒤 이분매칭을 해주면 됩니다.전체에서 전체로 이분매칭을 하는 것이 왜 문제의 해답이 되는가 라고 생각할 수 있습니다.문제에서 제시된 첫 번째 예시를 예로 들겠습니다.  connected_with_first : 첫 번째 수가 연결된 수 / connected : 선택된 수가 연결되어있는 인덱스    connected_with_first : 4 / connected : [3, 0, 1, 2, 5, 4]     connected_with_first : 10 / connected : [3, 2, 1, 0, 5, 4] ..

728x90