본문 바로가기

분류 전체보기282

1647. 도시 분할 계획 (Python) 1647번: 도시 분할 계획 첫째 줄에 집의 개수 N, 길의 개수 M이 주어진다. N은 2이상 100,000이하인 정수이고, M은 1이상 1,000,000이하인 정수이다. 그 다음 줄부터 M줄에 걸쳐 길의 정보가 A B C 세 개의 정수로 주어지는데 A번 www.acmicpc.net 풀이 최소 신장 트리(MST, Minimum Spanning Tree) 개념을 사용하여 해결할 수 있다. MST를 만들기 위한 알고리즘 중 크루스칼 알고리즘을 사용하였다. 유지비를 오름차순으로 정렬하여 작은것부터 선택하여 사이클이 발생하지 않도록 그래프를 만들어나가면 된다. 원래 N개의 정점이 있는 그래프를 MST로 만들기 위해서는 N-1개의 간선이 필요한데 문제에서는 마을을 두 개의 분리된 마을로 분할한다고 하였다. 그렇기.. 2022. 2. 28.
4195. 친구 네트워크 (Python) 4195번: 친구 네트워크 첫째 줄에 테스트 케이스의 개수가 주어진다. 각 테스트 케이스의 첫째 줄에는 친구 관계의 수 F가 주어지며, 이 값은 100,000을 넘지 않는다. 다음 F개의 줄에는 친구 관계가 생긴 순서대로 주어진 www.acmicpc.net 풀이 유니온 파인드를 사용하여 해결할 수 있다. 해당 문제에서는 2개의 딕셔너리를 사용한다. 하나는 친구 관계에서 루트가 될 사용자를 설정하는 parent 딕셔너리이고, 나머지 하나는 친구가 몇 명이 있는지를 카운트하는 friendCount 딕셔너리이다. 친구 관계가 주어졌을 때 처음 등장하는 사용자라면 friendCount에 사용자 아이디를 키 값으로 하여 1로 설정해준다. 그 후 두 사용자를 union 함수를 사용하여 관계를 설정해준다. 만약 두 .. 2022. 2. 28.
17182. 우주 탐사선 (Python) 17182번: 우주 탐사선 우주 탐사선 ana호는 어떤 행성계를 탐사하기 위해 발사된다. 모든 행성을 탐사하는데 걸리는 최소 시간을 계산하려 한다. 입력으로는 ana호가 탐색할 행성의 개수와 ana호가 발사되는 행성의 위 www.acmicpc.net 풀이 먼저 모든 지점에서 다른 모든 지점까지의 최단 거리를 구해야한다. 이를 위해서 플로이드 워셜 알고리즘을 사용하면 된다. 플로이드 워셜 알고리즘을 사용하여 최단 거리를 구해놓고 이후에는 순열을 통해서 모든 행성을 방문하는 경우의 수에 대해서 거리를 계산하고 그중 최단 거리를 출력하면 된다. 순열을 구할 때는 시작 행성 위치는 제외하여 구해주면 된다. 문제의 2번째 예제를 예로 들면 1번 행성에서 출발하므로 총 [(0, 2, 3), (0, 3, 2), (2.. 2022. 2. 25.
3079. 입국심사 (Python) 3079번: 입국심사 첫째 줄에 N과 M이 주어진다. (1 ≤ N ≤ 100,000, 1 ≤ M ≤ 1,000,000,000) 다음 N개 줄에는 각 심사대에서 심사를 하는데 걸리는 시간인 Tk가 주어진다. (1 ≤ Tk ≤ 109) www.acmicpc.net 풀이 친구들이 심사를 마치는데 걸리는 시간에 대해 이분탐색을 하여 해결할 수 있다. left와 right를 설정하고 mid를 구하여 mid초에 대해서 각 심사대에서 몇 명을 심사할 수 있는지를 체크하여 상근이와 친구들의 수인 M보다 클 경우 답을 갱신해주면 된다. 코드 if __name__ == '__main__': N, M = map(int, input().split()) # N: 입국심사대 총 개수, M: 상근이와 친구들의 수 times = [.. 2022. 2. 25.
15961. 회전 초밥 (Python) 15961번: 회전 초밥 첫 번째 줄에는 회전 초밥 벨트에 놓인 접시의 수 N, 초밥의 가짓수 d, 연속해서 먹는 접시의 수 k, 쿠폰 번호 c가 각각 하나의 빈 칸을 사이에 두고 주어진다. 단, 2 ≤ N ≤ 3,000,000, 2 ≤ d ≤ 3,000, 2 www.acmicpc.net 풀이 슬라이딩 윈도우를 사용하여 해결할 수 있는 문제이다. 연속으로 먹는 접시에 있는 초밥의 종류에 따른 개수를 카운트 할 수 있는 리스트를 하나 만들어 각 초밥의 개수를 카운트 해주었다. 문제를 해결하는 과정은 다음과 같다. * kind : 현재 범위에서 초밥의 종류 개수, counts[n] : 현재 범위에서 n 종류 초밥의 개수, res : 초밥 종류의 최댓값 쿠폰 번호에 해당하는 초밥의 count를 하나 증가시키고.. 2022. 2. 23.
11049. 행렬 곱셈 순서 (Python) 11049번: 행렬 곱셈 순서 첫째 줄에 입력으로 주어진 행렬을 곱하는데 필요한 곱셈 연산의 최솟값을 출력한다. 정답은 231-1 보다 작거나 같은 자연수이다. 또한, 최악의 순서로 연산해도 연산 횟수가 231-1보다 작거나 같 www.acmicpc.net 풀이 2차원 dp를 활용하여 구할 수 있다. 2차원 dp는 다음을 의미한다. 위의 예제는 dp[2][5]를 구하는 과정 중 하나의 예를 나타낸다. dp[2][5]를 구하기 위해서는 다음과 같은 경우를 모두 탐색해야 한다. dp[2][2] + dp[3][5] + 곱셈 연산 dp[2][3] + dp[4][5] + 곱셈 연산 dp[2][4] + dp[5][5] + 곱셈 연산 이 중 최솟값이 dp[2][5]에 기록된다. 이를 구하는 점화식은 다음과 같다. f.. 2022. 2. 23.