본문 바로가기

알고리즘15

[백준] 1956 : 운동 (JAVA), 플로이드-와샬(Floyd-Warshall) https://www.acmicpc.net/problem/1956 1956번: 운동 첫째 줄에 V와 E가 빈칸을 사이에 두고 주어진다. (2 ≤ V ≤ 400, 0 ≤ E ≤ V(V-1)) 다음 E개의 줄에는 각각 세 개의 정수 a, b, c가 주어진다. a번 마을에서 b번 마을로 가는 거리가 c인 도로가 있다는 의 www.acmicpc.net Solution 사이클을 이루는 도로의 길이의 합이 최소가 되는 것을 찾기 위해서는 모든 정점으로 부터 모든 정점까지의 최단 거리를 구해야한다. 이 때, 가중치 c의 범위가 10,000 이하의 자연수 이므로 음의 가중치를 갖지 않는다. 또한, V가 400이하로 범위가 작다. 다익스트라, 플로이드-와샬 둘 다 가능하다. 나는 플로이드-와샬을 사용했다. 플로이드 와샬.. 2023. 1. 18.
[알고리즘] 플로이드-와샬, Floyd-Warshall 백준 문제를 풀다가 플로이드-와샬 문제를 또 마주쳤다. 몇 번 풀어본적 있는 유형임에도 플로이드 와샬이 뭐더라... 싶더라. 인간은 망각의 동물이구나... 플로이드-와샬 알고리즘 모든 정점에서 모든 정점으로 최단 경로를 구하는 알고리즘 시간 복잡도 O(v^3) 음수 사이클이 없는 그래프에 적용됨 음의 가중치 허용 플로이드-와샬(Floyd Warshall) vs. 다익스트라(Dijkstra) 다익스트라 하나의 정점에서 다른 모든 정점까지의 최단 거리를 구하는 알고리즘 (S.S.S.P - Single Source Shortest Path) 매번 가장 적은 비용을 가진 노드를 하나씩 꺼낸 다음 그 노드를 거쳐가는 비용, 즉 가장 적은 비용을 하나씩 선택하는 로직 우선순위 큐 + BFS의 형태 시간 복잡도 O(.. 2023. 1. 18.
[백준] 1080 : 행렬 (JAVA) https://www.acmicpc.net/problem/1080 1080번: 행렬 첫째 줄에 행렬의 크기 N M이 주어진다. N과 M은 50보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에는 행렬 A가 주어지고, 그 다음줄부터 N개의 줄에는 행렬 B가 주어진다. www.acmicpc.net Solution 대표적인 그리디 문제다. 너무 복잡하게 생각하느라고 시간을 낭비한 편이다(...) 문제를 풀면서 깨달은 점은 0->1, 1->0 뒤집기 문제에서는 불일치 하는 숫자를 최대한 한번에 많이 뒤집으려고 하는 시도가 무의미하다.. => 2번 뒤집으면 원상복귀한다. => 전부 일치하게 만드는 뒤집기가 아닌 이상 부분적으로 불일치가 일어난다. 이후에 처리가 되는지 알 수가 없다. 현재 뒤집는 시도가 이전에.. 2022. 7. 28.
[백준] 1149 : RGB거리 (JAVA) 1149번: RGB거리 첫째 줄에 집의 수 N(2 ≤ N ≤ 1,000)이 주어진다. 둘째 줄부터 N개의 줄에는 각 집을 빨강, 초록, 파랑으로 칠하는 비용이 1번 집부터 한 줄에 하나씩 주어진다. 집을 칠하는 비용은 1,000보다 작거나 www.acmicpc.net Solution dp 문제인데 삽질을 했다... 아래와 같이 간단히 생각하면 금방 점화식을 도출할 수 있다 R G B house[0] house[0][0] house[0][1] house[0][2] house[1] Math.min(house[0][1], house[0][2]) + house[1][0] Math.min(house[0][0], house[0][2]) + house[1][1] Math.min(house[0][0], house[0].. 2022. 7. 28.
[백준] 9663 : N-Queen (JAVA) 9663번: N-Queen N-Queen 문제는 크기가 N × N인 체스판 위에 퀸 N개를 서로 공격할 수 없게 놓는 문제이다. N이 주어졌을 때, 퀸을 놓는 방법의 수를 구하는 프로그램을 작성하시오. www.acmicpc.net N-Queen 문제는 크기가 N × N인 체스판 위에 퀸 N개를 서로 공격할 수 없게 놓는 문제이다. N이 주어졌을 때, 퀸을 놓는 방법의 수를 구하는 프로그램을 작성하시오. Solution 너무 유명한 알고리즘이라 퀸이 어떻게 움직이는 지도 써져있지 않다..(^^) 퀸은 상하좌우대각선 8방향으로 움직인다. 2차원 배열을 이용해도 되지만, index를 열, arr[index]를 행으로 하는 1차원 배열로 푸는게 더 간단하다. 위의 경우 arr = { 6, 4, 2, 0, 5, .. 2022. 7. 28.
[백준] 3273 : 두 수의 합 (JAVA) 11053번: 가장 긴 증가하는 부분 수열 수열 A가 주어졌을 때, 가장 긴 증가하는 부분 수열을 구하는 프로그램을 작성하시오. 예를 들어, 수열 A = {10, 20, 10, 30, 20, 50} 인 경우에 가장 긴 증가하는 부분 수열은 A = {10, 20, 10, 30, 20, 50} 이 www.acmicpc.net 전형적인 LIS 문제이다. 하지만 역시 dp에 약한 나는 애를 먹었다... 문제를 읽고 처음 들었던 생각은, 수열의 i번째 값을 탐색할 경우 0 부터 i-1 값을 다 살펴보면 O(n^2) 으로 시간초과가 나지 않나? 하는 의문이었다. 게다가 i-1 과 i-2 만 살펴보는 피보나치와 달리 0 ~ i-1 을 매번 탐색하는 것은 dp 가 아니라고 생각했다. 결론적으로 O(n^2) 로 푸는 것.. 2022. 7. 28.