본문 바로가기

분류 전체보기209

최단거리구하기_다익스트라(Dijkstra) 알고리즘 다익스트라 알고리즘에 대한 이해 - 하나의 정점으로 부터 다른 모든 정점까지의 최단거리를 구하는 문제이다. - 음수 간선이 있는 그래프에서는 사용할 수 없다. - 우선순위큐를 이용한다. V = 6, E = 7인 다음 그래프에 대하여, 정점 1번으로 부터 다른 모든 정점까지의 거리를 구해보자. 1번으로부터의 거리를 저장하는 dist 배열을 구성하고, 우선순위 큐에 1번 노드의 (거리, 노드번호)를 추가한다. 우선순위 큐는 가장 작은 값을 먼저 뱉어내므로, 1번으로부터의 거리가 가장 가까운 노드를 뽑아내면 (0, 1)이 된다. 이 때, 큐에서 뽑아낸 (0, 1)의 정보와 배열의 정보 dist[1] = 0이 일치하므로 1번까지의 거리를 확정한다. 1번에서 이동할 수 있는 노드는 2번 노드 뿐이다. 거리가 확정.. 2022. 8. 29.
[프로그래머스 lv3] 단어 변환 풀이 해설재귀를 이용하여 가능한 모든 경우를 탐색하는 백트래킹 문제이다.현재 단어를 x라고 했을 때, 다음으로 이동할 수 있는 단어는 words에 있는 단어 중 아직 방문하지 않았고, x와 한개의 글자만 다른 단어이다.다음 단어로 이동하면서, 도착한 노드가 target과 같을 때 이동 횟수의 최솟값을 갱신한다.모든 경로를 탐색한 뒤 이동 횟수의 최솟값을 리턴하면 정답이다.  코드#include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std;using ii = pair;using iii = tuple;int mn =.. 2022. 8. 29.
[프로그래머스 lv3] 여행경로 풀이 해설여러 경로가 있을 때, 사전 순으로 목적지를 선택해야 하므로 tickets을 정렬시킨다. 흔히 dfs는 노드를 중심으로 방문여부를 체크하고 탐색을 진행한다.그런데, 이 문제의 경우 노드가 아닌 티켓을 중심으로 탐색을 진행해야 한다.노드의 경우 여러번 방문이 가능하기 때문에, 티켓의 사용여부를 체크하면서 다음 티켓을 탐색해야 한다. 현재 방문 노드가 x일 때, 출발지를 x로 하는 티켓 중 아직 체크되지 않은 티켓을 사용할 수 있다.tickets[i]를 사용할 때, tickest[i][1]이 다음 목적지가 되므로 tickets[i][1]을 출발지점으로 하는 dfs를 수행하면 된다.가능한 깊이까지 모두 탐색하였을 때, 모든 티켓을 사용하지 않았다면 다음 루트를 고려해야 하므로 flag를 사용하여 모든 티켓.. 2022. 8. 28.
[프로그래머스 lv3] 네트워크 풀이 해설bfs(너비 우선 탐색)을 수행하면 한번에 하나의 그래프를 탐색할 수 있다.visited 배열에 탐색한 노드를 체크할 때, 특정 노드를 아직 체크하지 않았다면 해당 노드를 루트노드로 하는 새로운 그래프를 탐색할 수 있다는 뜻이다.따라서, 모든 노드를 순회하면서 해당 노드가 이미 체크되었는지 확인하고, 체크되지 않았다면 이를 루트노드로 하는 새로운 그래프를 bfs로 탐색한다.새로운 그래프를 순회할 때마다 네트워크 개수를 1 증가시키고 총 네트워크 개수를 리턴하면 정답이다.  코드#include #include #include #include #include #include #include #include #include #include #include #include #include #include #.. 2022. 8. 27.
[프로그래머스 lv3] 순위 풀이 해설n의 입력값이 100이하 이므로, 시간복잡도가 O(V^3)인 플로이드 와샬 알고리즘으로 해결할 수 있다. i가 k를 이길 수 있고, k가 j를 이길 수 있을 때, i는 j를 이길 수 있다.따라서, dp[i][k] == true 이고 dp[k][j] == true 이면 dp[i][j] = true 이다. 위의 사실을 이용하여 이길 수 있는 모든 경우를 구해놓은 뒤, 특정 선수에 대하여 이기는 경우의 수와 지는 경우의 수를 모두 세어보자.특정 선수가 이기는 사람 수를 nwin, 특정 선수가 지는 사람 수를 nloss라고 했을 때 nwin+nloss-1(본인 제외) = n 이면 해당 선수의 순위를 결정할 수 있다. nwin+loss-1 == n인 선수의 수를 카운트하여 리턴하면 정답이다. 코드#includ.. 2022. 8. 27.
[프로그래머스 lv3] 가장 먼 노드 풀이 ✅ 프로그래머스의 모든 문제와 해설 보기[클릭] 해설 1번 노드로 부터 각 노드까지의 최단 거리를 구한 후, 최단 거리가 최대인 노드의 개수를 구하는 문제이다. 1번 노드를 출발지점으로 하여 bfs를 수행시키고, 각 노드를 방문할 때 최단 거리를 기록한다. 1번 노드로 부터 x번 노드까지의 최단 거리를 dist[x]라 할 때, dist[x] 값 중 최댓값을 구하고, 최댓값을 갖는 x의 개수를 리턴하면 정답이다. 코드 #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; using ii = pair;.. 2022. 8. 27.
[프로그래머스 lv2] 3xn 타일링 풀이 ✅ 프로그래머스의 모든 문제와 해설 보기[클릭] 해설 2x1(1x2) 모양의 직사각형으로 3xn 직사각형을 채우는 경우의 수를 구하는 문제이다. n을 하나씩 늘려가면서 규칙을 찾아보자. 1. n = 1 일 때 주어진 직사각형으로 3 x 1 직사각형을 채울 수 없다. n = 1 뿐만 아니라 n이 홀수이면 무조건 채울 수 없다는 사실을 알 수 있다. 2. n = 2 일 때 3가지 방법으로 채울 수 있다. 즉, d[2] = 3 3. n = 4 일 때 (1) 앞의 두 칸을 먼저 채우고 나머지를 3x2 직사각형을 채우는 방법으로 채운다. (3 x dp[2]) (2) 네 칸을 전역에 걸쳐 채운다. (2) (네 칸을 전역에 걸쳐 채우는 방법은 다음과 같다.) 즉, dp[4] = 3 x dp[2] + 2 4. n = .. 2022. 8. 25.
[프로그래머스 lv2] 스킬 트리 풀이 ✅ 프로그래머스의 모든 문제와 해설 보기[클릭] 해설 문자열 s가 스킬 순서를 만족하는지 확인하는 과정은 다음과 같다. 1) 문자열 s를 순회하면서 각 문자가 주어진 skill 에 포함되어있는지 확인한다. 2) skill에 포함되어있다면, 스킬 중 몇번째 순서인지 인덱스를 확인하여 기록해놓는다. 3) 문자열을 모두 순회하고 기록된 인덱스를 보았을 때, 기록된 인덱스는 0부터 시작하고 1씩 증가하는 오름차순 배열이어야 한다. 해당 조건을 만족한다면 스킬 순서를 지키는 문자열로, 만족하지 않는다면 스킬 순서를 지키지 않은 문자열로 판단한다. skill_trees로 주어진 문자열 중에서 스킬 순서를 지키는 문자열의 개수를 리턴하면 정답이다. 코드 #include #include #include #include.. 2022. 8. 25.
[프로그래머스 lv2] 배달 풀이 ✅ 프로그래머스의 모든 문제와 해설 보기[클릭] 해설 1번 노드에서 각 노드까지의 거리를 구한 후, 거리가 K이하인 노드의 개수를 세는 문제이다. 그래프에서 노드끼리의 거리를 구하기 위해서는 다음 세가지 알고리즘을 사용할 수 있다. 1) 다익스트라 2) 벨만-포드 3) 플로이드 와샬 입력값의 범위가 50 이하이므로 O(v^3)의 시간 복잡도가 가능하다. 구현이 간단한 플로이드 와샬을 통해 각 노드까지의 거리를 구해보자. (참고: 최단거리구하기_플로이드 와샬(Floyd Warshall) 알고리즘) dp[i][j]는 i에서 j까지의 최단 거리이므로, dp[1][j] 값이 K이하인 노드의 개수를 세고 리턴하면 정답이다. 코드 #include #include #include #include #include #i.. 2022. 8. 25.
[프로그래머스 lv2] 쿼드 압축 후 개수 세기 풀이 ✅ 프로그래머스의 모든 문제와 해설 보기[클릭] 해설 주어진 정사각형의 한변의 길이를 n이라 할 때, n x n 정사각형을 4개로 나누어가며 압축하는 문제이다. 정사각형의 한 변의 길이는 n -> n/2 -> n/4 -> ... -> 1 이 되는데, 해당 과정을 재귀로 처리할 수 있다. func(int x, int y, int n)은 왼쪽 위 꼭짓점이 (x, y)이고 한변의 길이가 n인 정사각형에 대하여, 쿼드 압축 결과를 구하는 함수이다. 만약, 해당 정사각형이 모두 같은 수로 이루어져있다면 그 수의 개수를 1 증가시킨다. 만약, 해당 정사각형이 모두 같은 수로 이루어져있지않다면, 한변의 길이가 n/2인 4개의 정사각형으로 나누어 재귀적으로 쿼드 압축 결과를 구한다. 4개 정사각형의 각 꼭직점은 (x,.. 2022. 8. 25.