본문 바로가기

Algorithm

(140)
플로이드 유형 파악 및 구현 이 문제는 플로이드-워셜 알고리즘으로 간단히 구현 가능하다. 다만, 이 문제를 풀면서 정확히 정리해야함을 느꼈다. 쉬운문제인만큼 꼼꼼히 봐야한다. Problems - 간선별로 양방향 노드가 연결된게 아닌데 처리해버림 - 시작노드와 도착노드를 연결하는 노선은 하나가 아닐 수 있다라는 조건을 놓침 - INF인 경우 0처리 안함. 코드 INF = int(1e9) n = int(input()) m = int(input()) graph = [[INF]*(n+1) for _ in range(n+1)] for i in range(m): a, b, c = map(int, input().split()) graph[a][b] = min(graph[a][b], c) for i in range(1, n+1..
전보 유형 파악 이 문제는 특정 노드에서 다른 모든 노드로 갈 때 최단 경로를 구하는 문제이다. 다익스트라 알고리즘이 적합하다. 내 개인적인 생각으로는 최단 경로 알고리즘들은 그냥 적용하면 된다. 코드 import heapq n, m, c = 3, 2, 1 graph = [ [], [[2, 4], [3, 2]], [], [] ] INF = int(1e9) distance = [INF]*(n+1) distance[1] = 0 q = [] heapq.heappush(q, [0, 1]) while q: dist, now = heapq.heappop(q) if dist > distance[now]: continue for i in graph[now]: next_node = i[0] next_dist = i[1] di..
미래 도시 유형 파악 이 문제는 간단하다. a에서 b 그리고 b에서 c로의 이동을 다뤘다. 즉, 모든 경로에 대한 최단 경로가 필요하므로 최단 경로 알고리즘 중에서도 플로이드 워셜 알고리즘을 사용한다. 특징 적으로 3단 반복문을 사용하면 된다. 코드 n, m = map(int, input().split()) INF = 1e9 graph = [[INF]*(n+1) for _ in range(n+1)] for i in range(m): a, b = map(int, input().split()) graph[a][b] = 1 graph[b][a] = 1 x, k = map(int, input().split()) for i in range(1, n+1): graph[i][i] = 0 for a in range(1, n+1)..
Shortest Way - Concept 해당 문제는 "이것이 코딩 테스트이다" 책을 참고하여 제작하였습니다. - 한 지점에서 다른 특정 지점까지의 최단경로를 구해야 하는 경우 - 모든 지점에서 다른 모든 지점까지의 최단경로를 구해야하는 경우 종류 다익스트라 최단 경로 알고리즘 - 특정한 노드에서 출발하여 다른 노드로 가는 각각의 최단경로를 구해주는 알고리즘 - ex) 노드1 to 노드 2, 3, 4, 5 - 시간복잡도 : O(ElogV) - 우선순위 큐 (heapq), distance 테이블 활용 플로이드 워셜 알고리즘 - 모든 노드에서 출발하여 모든 다른 노드로 가는 각각의 최단경로를 구해주는 알고리즘 - ex) 노드1, 2, 3, 4, 5 to 노드 1, 2, 3, 4, 5 - 시간 복잡도 : O(N**3) - 3중 for문 사용 - 비교..
가사 검색 유형 분석 및 구현 이 문제는 일단 이진탐색으로 풀되, 문자열을 뒤집는 방법이나 bisect활용을 다양하게 할 줄 아는가에 대한 여부를 파악해야하는 문제인 듯 하다. 또한 효율성 체크 또한 중요하다. - 항상 답안 제출시 print 남용된것 없나 확인 - 각 행을 정렬할건지 전체 리스트를 정렬할건지 확인하자 - 문제에 n(배열의 크기)가 입력되지 않는다면 max값으로 설정하자. 코드 from bisect import bisect_left, bisect_right # 찾고자하는 문자열의 시작인덱스와 마지막인덱스를 구할 수 있다. # 또한 이 문제 같은 경우는 left_value와 right_value를 달리하여 # left_value < 데이터 < right_value , 즉, 해당 범위 안에 있는 값을 ..
고정점 찾기 유형 파악 및 구현 이 문제는 두가지 방법으로 풀 수 있다. 파이썬에서 제공해주는 함수를 이용하거나 그냥 이진탐색을 내가 구현한다. 배열은 이미 정렬되어있다. "정렬되어 있는"이라는 말이 나오면 이진 탐색을 의심하는 것도 좋은 습관인 것 같다. 1. 이진 탐색 구현 방식은 그동안 하던 방식과 동일하다. 하지만 정당한지 봤을 때, 예를 들어 인덱스 2에 3이 있다고 가정하자. 인덱스 3부터는 value가 무조건 3보다는 클것이다. 따라서 이런 경우, 굳이 다음 부분을 확인할 필요가 없게 된다. 반대 경우도 마찬가지이다. 2. 함수 사용 bisect_left or bisect_right를 이용해 구현 가능하다. 이는 이진탐색을 기반으로 하는 탐색 알고리즘이다. 코드 arrays = [-15, -6, 1, 3..
정렬된 배열에서 특정 수의 개수 구하기 유형 분석 및 구현 이 문제는 직접 이진탐색을 구현한다기 보단, 파이썬에서 제공하는 이진탐색을 활용한 탐색 방법을 사용한다. 순차적 탐색과 비교해보면 최대 100만개에 데이터 중에서 최대 100만개의 데이터를 찾아야한다. 하지만 이진 탐색을 활용하면 확 줄어든다. 코드 from bisect import bisect_left, bisect_right n = 7 x = 2 array = [1, 1, 2, 2, 2, 2, 3] left_index = bisect_left(array, x) right_index = bisect_right(array, x) print(left_index, right_index) result = right_index-left_index if result == 0: print("-1..
떡볶이 떡 만들기 유형 파악 및 구현 떡의 최대 개수는 백만이고 요청한 떡의 최대 길이는 20억이다. 즉, 떡 백만개에 대해서 0부터 20억 사이의 값으로 잘랐을 때, 원하는 길이가 나와야되고 안나온다면 가장 가까운 값을 출력해야하는 문제이다. 만약, 자르는 길이 선정을 순차적 탐색으로 이를 구현한다고 했을 때, 1cm단위로 자르다 20억cm단위까지 잘라봐서 떡의 길이의 합이 m일 때 멈춘다. 최악의 경우 20억*100만의 연산을 한다. 시간 복잡도는 O(N*M) 반대로, 이진탐색으로 자르는 길이를 탐색한다면, 정렬을 할 필요는 없으므로, 정렬에 대한 연산 비용이 들지 않으니 고려하지 않고 시간 복잡도는 O(M*logN)이다. 따라서 이 문제는 무조건 이진탐색을 사용해야 한다. 코드 n = 4 m = 7 arrays = ..