[C++] 섬나라 아일랜드(BFS)
·
algorithms (C++)
📄문제 섬나라 아일랜드의 지도가 격자판의 정보로 주어집니다. 각 섬은 1로 표시되어 상하좌우와 대각선으로 연결되어 있으며, 0은 바다입니다. 섬나라 아일랜드에 몇 개의 섬이 있는지 구하는프로그램을 작성하세요. ⬇️ 입력 첫 번째 줄에 자연수 N(1 N) continue; // 방문 가능한 모든 섬 위치를 삽입 if (island[xx][yy] == 1) { island[xx][yy] = 0; q.push({ xx, yy }); } } } } } } printf("%d", cnt); } BFS를 활용하여 계산합니다. 2중 for문을 통해 해당 구역이 섬이라면, 해당 구역을 시작으로 인접한 영역을 모두 검사합니다. 더 이상 인접한 영역이 없어 queue가 비었다면, 섬 영역은 끝이며, 2중 for문을 이어서..
[C++] 피자 배달 거리(DFS) 🔥
·
algorithms (C++)
📄문제 N×N 크기의 도시지도가 있습니다. 도시지도는 1×1크기의 격자칸으로 이루어져 있습니다. 각 격자칸에는 0은 빈칸, 1은 집, 2는 피자집으로 표현됩니다. 각 격자칸은 좌표(행번호, 열 번호)로 표현됩니다. 행번호는 1번부터 N번까지이고, 열 번호도 1부터 N까지입니다. 도시에는 각 집마다 “피자배달거리”가 았는데 각 집의 피자배달거리는 해당 집과 도시의 존재하는 피자집들과의 거리 중 최소값을 해당 집의 “피자배달거리”라고 한다. 집과 피자집의 피자배달거리는 |x1-x2|+|y1-y2| 이다. 예를 들어, 도시의 지도가 아래와 같다면 (1, 2)에 있는 집과 (2, 3)에 있는 피자집과의 피자 배달 거리는 |1-2| + |2-3| = 2가 된다. 최근 도시가 불경기에 접어들어 우후죽순 생겼던 피자..
[C++] 수식만들기
·
algorithms (C++)
📄문제 길이가 N인 자연수로 이루어진 수열이 주어집니다. 수열의 각 항 사이에 끼워넣을 N-1개의 연산자가 주어집니다. 연산자는 덧셈(+), 뺄셈(-), 곱셈(×), 나눗셈(÷)으로만 이루어져 있습니다. 수열의 순서는 그대로 유지한 채 각 항사이에 N-1개의 연산자를 적절히 배치하면 다양한 수식이 나옵니다. 예를 들면, 수열이 1 2 3 4 5이고 덧셈(+) 1개, 뺄셈(-) 1개, 곱셈(×) 1개, 나눗셈(÷) 1개인 일 때 만들 수 있는 수식은 많은 경우가 존재한다. 그 중 1+2*3-4/5와 같이 수식을 만들었다면 수식을 계산하는 결과는 연산자 우선순위를 따지지 않고 맨 앞쪽 연산자부터 차례로 계산한다. 수식을 계산한 결과는 1이다. N길이의 수열과 N-1개의 연산자가 주어지면 만들 수 있는 수식들..
[C++] 휴가(DFS) 🔥
·
algorithms (C++)
📄문제 카운슬러로 일하고 있는 현수는 오늘부터 N+1일째 되는 날 휴가를 가기 위해서, 남은 N일 동안 최대한 많은 상담을 해서 휴가비를 넉넉히 만들어 휴가를 떠나려 한다. 현수가 다니는 회사에 하루에 하나씩 서로 다른 사람의 상담이 예약되어 있다. 각각의 상담은 상담을 완료하는데 걸리는 날수 T와 상담을 했을 때 받을 수 있는 금액 P로 이루어져 있다. 만약 N = 7이고, 아래와 같이 예약이 잡혀있다면 1일에 잡혀있는 상담은 총 4일이 걸리며, 상담했을 때 받을 수 있는 금액은 20이다. 만약 1일에 예약된 상담을 하면 4일까지는 상담을 할 수가 없다. 하나의 상담이 하루를 넘어가는 경우가 많기 때문에 현수는 예약된 모든 상담을 혼자 할 수 없어 최대 이익이 나는 상담 스케줄을 짜기로 했다. 휴가를 ..
[C++] 복면산 SEND+MORE=MONEY 🔥
·
algorithms (C++)
📄문제 SEND+MORE=MONEY 라는 유명한 복면산이 있습니다. 이 복면산을 구하는 프로그램을 작성하세요. ⬇️ 입력 없음 ⬆️ 출력 9 5 6 7 + 1 0 8 5 ------------ 1 0 6 5 2 📝 풀이 #include // S E N D M O R Y // 각 인덱스 번호에는 위에 해당하는 문자로 간주되어 계산 int arr[8]; // 0부터 9까지를 사용했는지 체크 bool ch[10]; int SEND() { // arr의 각 인덱스 번호에 해당하는대로 네자리 숫자로 출력 return arr[0] * 1000 + arr[1] * 100 + arr[2] * 10 + arr[3] * 1; } int MORE() { return arr[4] * 1000 + arr[5] * 100 + a..
[C++] 순열구하기(DFS : Depth First Search) 🔥
·
algorithms (C++)
📄 문제 자연수 N과 R이 주어지면 서로 다른 N개의 자연수 중 R개를 뽑아 일렬로 나열하는 프로그램을 작성하세요. ⬇️ 입력 첫 번째 줄에 자연수 N(1
[C++] 벨만-포드 알고리즘 ⭐
·
algorithms (C++)
벨만-포드(Bellman-Ford) 알고리즘은 그래프 내에서 단일 출발 노드로부터 모든 다른 노드까지의 최단 경로를 찾는 알고리즘 중 하나입니다. 벨만-포드 알고리즘은 음수 가중치를 가진 간선도 처리할 수 있으며, 음수 가중치 간선이 사이클(음의 사이클)을 형성하지 않는 경우에 사용할 수 있습니다. 음수 가중치 처리 벨만-포드 알고리즘은 음수 가중치를 가진 간선을 처리할 수 있습니다. 단, 음수 가중치 사이클이 없어야 합니다. 음수 가중치 사이클이 있을 경우 알고리즘은 무한 반복됩니다. 시간 복잡도 벨만-포드 알고리즘의 시간 복잡도는 O(V * E)입니다. 여기서 V는 노드의 수, E는 간선의 수를 나타냅니다. 각 노드에 대해 모든 간선을 검사하기 때문에 모든 간선을 한 번씩 확인하는 과정이 V번 반복됩..
[C++] 다익스트라 알고리즘 ⭐
·
algorithms (C++)
다익스트라(Dijkstra) 알고리즘은 그래프 내에서 특정 출발 노드로부터 모든 다른 노드까지의 최단 경로를 찾는 알고리즘 중 하나입니다. 다익스트라 알고리즘은 가중치가 양수인 간선을 가지는 그래프에서 사용됩니다. 우선순위 큐를 사용하여 효율적으로 접근합니다. 그 이유는, Dijkstra 알고리즘에서 최소 가중치를 가진 간선을 선택하는 데 필요한 노드의 후보 집합을 효율적으로 관리하기 위함입니다. 최소 가중치 간선 선택 Dijkstra 알고리즘은 시작 노드에서부터 다른 노드로 가는 최단 경로를 찾는 것이 목적입니다. 이를 위해 각 단계에서 최소 가중치를 가진 간선을 선택해야 합니다. 우선순위 큐는 간선을 가중치 순으로 관리하므로 최소 가중치 간선을 빠르게 선택할 수 있습니다. 노드의 후보 집합 관리 Di..
[C++] 원더랜드(Prim MST 알고리즘 : priority_queue 활용) ⭐
·
algorithms (C++)
프림(Prim) 알고리즘은 그래프의 최소 신장 트리(Minimum Spanning Tree, MST)를 찾는 알고리즘 중 하나로, 시작 노드에서부터 출발하여 MST를 구성하는 과정을 설명합니다. 프림 알고리즘에서 priority_queue를 활용하는 것은 간선의 선택과 관련이 있습니다. 알고리즘 개요 1. 임의의 시작 노드를 선택하고, 해당 노드를 MST에 추가합니다. 2. MST에 속한 노드와 아직 MST에 포함되지 않은 노드 사이의 모든 간선 중에서 최소 가중치 간선을 선택합니다. 3. 선택한 간선의 도착 노드를 MST에 추가하고, 해당 노드를 MST의 일부로 만듭니다. 4. 위의 단계를 MST가 모든 노드를 포함할 때까지 반복합니다. priority_queue의 활용 프림 알고리즘에서 각 단계마다 ..
[C++] 원더랜드(Kruskal MST 알고리즘 : Union&Find 활용) ⭐
·
algorithms (C++)
크루스칼(Kruskal) 알고리즘을 사용하여 그래프의 최소 신장 트리(Minimum Spanning Tree)를 찾습니다. 최소 신장 트리는 그래프의 모든 노드를 포함하면서 모든 노드를 연결하는 데 필요한 간선 중에서 가중치의 합이 최소인 트리입니다. 📄문제 원더랜드에 문제가 생겼다. 원더랜드의 각 도로를 유지보수하는 재정이 바닥난 것이다. 원더랜드는 모든 도시를 서로 연결하면서 최소의 유지비용이 들도록 도로를 선택하고 나머지 도로는 폐쇄하려고 한다. 어떤 도로는 도로를 유지보수하면 재정에 도움이 되는 도로도 존재한다. 재정에 도움이 되는 도로는 비용을 음수로 표현했다. 아래의 그림은 그 한 예를 설명하는 그림이다. 위의 지도는 각 도시가 1부터 9로 표현되었고, 지도의 오른쪽은 최소비용 196으로 모든..
[C++] 친구인가?(Union&Find) ⭐
·
algorithms (C++)
Union-Find, 또는 Disjoint-Set,는 그래프 이론과 컴퓨터 과학에서 사용되는 자료 구조입니다. 이 자료 구조는 여러 원소 집합을 관리하고 원소 간의 관계를 효과적으로 조사할 수 있도록 도와줍니다. 주로 연결 요소를 관리하거나 등가성 판별을 위해 사용됩니다. Union(x, y): 두 집합을 하나로 합칩니다. 즉, 원소 x가 속한 집합과 원소 y가 속한 집합을 합쳐서 하나의 집합으로 만듭니다. Find(x): 원소 x가 속한 집합을 찾아서 대표 원소(또는 부모 원소)를 반환합니다. 이 연산을 통해 원소 간의 관계를 확인할 수 있으며, 두 원소가 동일한 집합에 속하는지 확인할 수 있습니다. 📄문제 오늘은 새 학기 새로운 반에서 처음 시작하는 날이다. 현수네 반 학생은 N명이다. 현수는 각 학..
[C++] 이항계수(메모이제이션) ⭐
·
algorithms (C++)
이항 계수(binomial coefficient)는 조합론(Combinatorics)에서 사용되는 수학적 개념으로, 주어진 크기의 집합에서 원하는 개수의 원소를 선택하는 방법의 수를 나타냅니다. 이항 계수는 주로 "n choose k"로 표기되며, "n choose k"는 n개의 원소 중에서 k개의 원소를 선택하는 경우의 수를 의미합니다. 이항 계수의 조합적 특성은 다음과 같습니다: C(n,k) = C(n−1,k−1) + C(n−1,k) ​ 📄문제 이항계수는 N개의 원소를 가지는 집합에서 R개의 원소를 뽑아 부분집합을 만드는 경우의 수 를 의미한다. 공식은 nCr 로 표현된다. N과 R이 주어지면 이항계수를 구하는 프로그램을 작성하세요. ⬇️ 입력 첫 번째 줄에 자연수 N(1
[C++] 최대 수입 스케쥴(priority_queue 응용문제)
·
algorithms (C++)
📄문제 현수는 유명한 강연자이다. N개이 기업에서 강연 요청을 해왔다. 각 기업은 D일 안에 와서 강연을 해 주면 M만큼의 강연료를 주기로 했다. 각 기업이 요청한 D와 M를 바탕으로 가장 많을 돈을 벌 수 있도록 강연 스케쥴을 짜야 한다. 단 강연의 특성상 현수는 하루에 하나의 기업에서만 강연을 할 수 있다. ⬇️ 입력 첫 번째 줄에 자연수 N(1
[C++] 최소힙(priority_queue : 우선순위 큐)
·
algorithms (C++)
C++에서 priority_queue는 STL의 일부로 제공되는 데이터 구조 중 하나입니다. 요소들을 우선순위에 따라 정렬하여 다루는 자료 구조입니다. priority_queue는 힙(Heap) 자료 구조를 기반으로 작동하며, 기본적으로 내림차순(큰 값이 우선순위가 높음)으로 요소를 정렬합니다. 요소를 삽입할 때 우선순위에 따라 자동으로 정렬하고, 우선순위가 가장 높은 요소를 빠르게 추출할 수 있습니다. 📄문제 최소힙은 완전이진트리로 구현된 자료구조입니다. 그 구성은 부모 노드값이 왼쪽자식과 오른쪽 자식노드의 값보다 작게 트리를 구성하는 것입니다. 그렇게 하면 트리의 루트(root)노드는 입력된 값들 중 가장 작은 값이 저장되어 있습니다. 예를 들어 5 3 2 1 4 6 7순으로 입력되면 최소힙 트리는 ..
[C++] 최대힙(priority_queue : 우선순위 큐)
·
algorithms (C++)
C++에서 priority_queue는 STL의 일부로 제공되는 데이터 구조 중 하나입니다. 요소들을 우선순위에 따라 정렬하여 다루는 자료 구조입니다. priority_queue는 힙(Heap) 자료 구조를 기반으로 작동하며, 기본적으로 내림차순(큰 값이 우선순위가 높음)으로 요소를 정렬합니다. 요소를 삽입할 때 우선순위에 따라 자동으로 정렬하고, 우선순위가 가장 높은 요소를 빠르게 추출할 수 있습니다. 📄문제 최대힙은 완전이진트리로 구현된 자료구조입니다. 그 구성은 부모 노드값이 왼쪽자식과 오른쪽 자식노드의 값보다 크게 트리를 구성하는 것입니다. 그렇게 하면 트리의 루트(root)노드는 입력된 값들 중 가장 큰 값이 저장되어 있습니다. 예를 들어 5 3 2 1 4 6 7순으로 입력되면 최대힙 트리는 아..
[C++] 공주 구하기(Queue 자료구조)
·
algorithms (C++)
📄문제 정보 왕국의 이웃 나라 외동딸 공주가 숲속의 괴물에게 잡혀갔습니다. 정보 왕국에는 왕자가 N명이 있는데 서로 공주를 구하러 가겠다고 합니다. 정보왕국의 왕은 다음과 같은 방법으로 공주를 구하러 갈 왕자를 결정하기로 했습니다. 왕은 왕자들을 나이 순으로 1번부터 N번까지 차례로 번호를 매긴다. 그리고 1번 왕자부터 N번 왕자까지 순서대로 시계 방향으로 돌아가며 동그랗게 앉게 한다. 그리고 1번 왕자부터 시계방향으로 돌아가며 1부터 시작하여 번호를 외치게 한다. 한 왕자가 K(특정숫자)를 외치면 그 왕자는 공주를 구하러 가는데서 제외되고 원 밖으로 나오게 된다. 그리고 다음 왕자부터 다시 1부터 시작하여 번호를 외친다. 이렇게 해서 마지막까지 남은 왕자가 공주를 구하러 갈 수 있다. 예를 들어 총 8..
[C++] 송아지 찾기(BFS : 상태트리탐색)
·
algorithms (C++)
📄문제 현수는 송아지를 잃어버렸다. 다행히 송아지에는 위치추적기가 달려 있다. 현수의 위치와 송아지의 위치가 직선상의 좌표 점으로 주어지면 현수는 현재 위치에서 송아지의 위치까지 다음과 같은 방법으로 이동한다. 현수는 스카이 콩콩을 타고 가는데 한 번의 점프로 앞으로 1, 뒤로 1, 앞으로 5를 이동할 수 있다. 최소 몇 번의 점프로 현수가 송아지의 위치까지 갈 수 있는지 구하는 프로그램을 작성하세요. ⬇️ 입력 첫 번째 줄에 현수의 위치 S와 송아지의 위치 E가 주어진다. 직선의 좌표 점은 1부터 10,000까지이다. ⬆️ 출력 점프의 최소횟수를 구한다. 📝 풀이 #include #include using namespace std; bool visited[10001]; int dist[10001]; /..
[C++] 그래프 최단거리(BFS) ⭐
·
algorithms (C++)
📄문제 다음 그래프에서 1번 정점에서 각 정점으로 가는 최소 이동 간선수를 출력하세요. ⬇️ 입력 첫째 줄에는 정점의 수 N(1
[C++] 이진트리 넓이우선탐색(BFS)
·
algorithms (C++)
📄문제 아래 그림과 같은 이진트리를 넓이우선탐색해 보세요. 간선 정보 6개를 입력받아 처리해보세요. ⬇️ 입력 1 2 1 3 2 4 2 5 3 6 3 7 ⬆️ 출력 1 2 3 4 5 6 7 📝 풀이 #include #include using namespace std; int queue[100], front = -1, back = -1; vector map[10]; int ch[10]; int main() { int f, t; // from, to for (int i = 0; i < 6; ++i) { scanf_s("%d %d", &f, &t); map[f - 1].push_back(t - 1); } for (int i = 0; i < 10; ++i) ch[i] = false; // 0번째 노드로 시작 q..
[C++] 최소비용(DFS)
·
algorithms (C++)
📄문제 가중치 방향그래프가 주어지면 1번 정점에서 N번 정점으로 가는 최소비용을 출력하는 프로그램을 작성하세요. ⬇️ 입력 첫째 줄에는 정점의 수 N(1 cost ? cost : minCost; else for (int i = 0; i = 0) { // v에 방문하기 DFS(i, cost + graph[v][i]); visited[i] = false; } } int main() { int M; scanf_s("%d %d", &N, &M); graph = vector(N, vector(N, -1)); visited = vector(N, false); int f, t, c; // from, to, cost for (int i = 0;..
[C++] 경로 탐색(인접리스트, DFS) ⭐
·
algorithms (C++)
📄문제 방향그래프가 주어지면 1번 정점에서 N번 정점으로 가는 모든 경로의 가지 수를 출력하는 프로그램을 작성하세요. 위 그래프에서 1번 정점에서 5번 정점으로 가는 가지 수는 총 6 가지입니다. 1 2 3 4 5 1 2 5 1 3 4 2 5 1 3 4 5 1 4 2 5 1 4 5 ⬇️ 입력 첫째 줄에는 정점의 수 N(1
[C++] 미로탐색(DFS)
·
algorithms (C++)
📄문제 7*7 격자판 미로를 탈출하는 경로의 가지수를 출력하는 프로그램을 작성하세요. 출발점은 격자의 (1, 1) 좌표이고, 탈출 도착점은 (7, 7)좌표이다. 격자판의 1은 벽이고, 0은 통로이다. 격자판의 움직임은 상하좌우로만 움직인다. 미로가 다음과 같다면 위의 지도에서 출발점에서 도착점까지 갈 수 있는 방법의 수는 8가지이다. ⬇️ 입력 첫 번째 줄부터 7*7 격자의 정보가 주어집니다. 0 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 0 1 0 0 0 1 1 0 1 0 1 1 1 1 0 0 0 0 1 1 1 0 1 1 0 0 1 0 0 0 0 0 0 ⬆️ 출력 첫 번째 줄에 경로의 가지수를 출력한다. 8 📝 풀이 #include #define _MAZE_SIZE 7 static bool ..
[C++] 경로 탐색(인접행렬, DFS) 🔥
·
algorithms (C++)
📄문제 방향그래프가 주어지면 1번 정점에서 N번 정점으로 가는 모든 경로의 가지 수를 출력하는 프로그램을 작성하세요. 위 그래프에서 1번 정점에서 5번 정점으로 가는 가지 수는 총 6 가지입니다. 1 2 3 4 5 1 2 5 1 3 4 2 5 1 3 4 5 1 4 2 5 1 4 5 ⬇️ 입력 첫째 줄에는 정점의 수 N(1
[C++] 인접행렬 가중치 그래프
·
algorithms (C++)
📄문제 아래 그림과 같은 그래프 정보를 인접행렬로 표현해보세요. ⬇️ 입력 첫째 줄에는 정점의 수 N(1
[C++] 병합 정렬
·
algorithms (C++)
리스트의 길이가 1 이하이면 이미 정렬된 것으로 봅니다. 그렇지 않은 경우에는 아래의 과정을 따릅니다. 분할(divide): 정렬되지 않은 리스트를 절반으로 잘라 비슷한 크기의 두 부분 리스트로 나눈다. 정복(conquer): 각 부분 리스트를 재귀적으로 합병 정렬을 이용해 정렬한다. 결합(combine): 두 부분 리스트를 다시 하나의 정렬된 리스트로 합병한다. 복사(copy): 임시 배열에 저장된 결과를 원래 배열에 복사한다. #include #include #include using namespace std; int a[101], tmp[101]; void divide(int lt, int rt) { int mid; int p1, p2, p3; if (lt < rt) { mid = (lt + rt)..
[C++] 특정 수 만들기 🔥
·
algorithms (C++)
📄문제 N개의 원소로 구성된 자연수 집합이 주어지면, 집합의 원소와 ‘+’, ‘-’ 연산을 사용하여 특정 수인 M을 만드는 경우가 몇 가지 있는지 출력하는 프로그램을 작성하세요. 각 원소는 연산에 한 번만 사용합니다. 예를 들어 {2, 4, 6, 8}이 입력되고, M=12이면 2+4+6=12 4+8=12 6+8-2=12 2-4+6+8=12 로 총 4가지의 경우가 있습니다. 만들어지는 경우가 존재하지 않으면 -1를 출력한다. ⬇️ 입력 첫 번째 줄에 자연수 N(1
[C++] 합이 같은 부분집합
·
algorithms (C++)
📄문제 N개의 원소로 구성된 자연수 집합이 주어지면, 이 집합을 두 개의 부분집합으로 나누었을 때 두 부분집합의 원소의 합이 서로 같은 경우가 존재하면 “YES"를 출력하고, 그렇지 않으면 ”NO"를 출력하는 프로그램을 작성하세요. 예를 들어 {1, 3, 5, 6, 7, 10}이 입력되면, {1, 3, 5, 7} = {6, 10} 으로 두 부분집합의 합이 16으로 같은 경우가 존재하는 것을 알 수 있다. ⬇️ 입력 첫 번째 줄에 자연수 N(1
[C++] 부분집합
·
algorithms (C++)
📄문제 자연수 N이 주어지면 1부터 N까지의 원소를 갖는 집합의 부분집합을 모두 출력하는 프로그램을 작성하세요. ⬇️ 입력 첫 번째 줄에 자연수 N(1= 0; --j) { int bit = 1
[C++] 재귀함수 이진수 출력
·
algorithms (C++)
📄문제 10진수 N이 입력되면 2진수로 변환하여 출력하는 프로그램을 작성하세요. ℹ️ 조건 재귀 함수를 이용하여 출력합니다. ⬇️ 입력 첫 번째 줄에 10진수 N(1
[C++] 기차 운행
·
algorithms (C++)
📄문제 A도시에서 출발한 기차는 B도시로 도착한다. 그런데 도로 중간에 T자형 교차로가 있어 출발한 기차의 도착 순서를 조정할 수 있다. 교차로에서는 다음과 같은 두 개의 작업을 합니다. P(push)작업 : A도시에서 오는 기차를 교차로에 넣는다. O(out)작업 : 교차로에 들어온 가장 최근 기차를 B도시로 보낸다. 만약 2 1 3 기차 번호 순으로 A도시에서 출발하더라도 B도시에는 T교차로를 이용하여 1 2 3 순으로 도착하게 할 수 있습니다. 그 작업 P, P, O, O, P, O순으로 작업을 하면 B도시에 1, 2, 3 순으로 도착합니다. 1부터 N까지 번호를 가진 기차가 A도시에서 어떤 순으로 출발하든, B도시에 번호순으로 도착하도록 하는 교차로 작업을 출력합니다. 모든 기차는 교차로에 들어가..
bonnate