알고리즘 102

[프로그래머스] 귤 고르기 with C++

문제 설명 제한 사항 및 입출력 예제 개념 주어진 배열에서 k개를 선택하는 방법 중 종류를 가장 적게 고르는 방법을 구하는 문제다. 배열을 내림차순으로 정렬하고, 가장 많은 개수를 가진 귤의 크기부터 선택하여 바구니에 담는 그리디 알고리즘을 채택하여 문제를 효율적으로 해결할 수 있다. 풀이 #include #include #include #include using namespace std; int solution(int k, vector tangerine) { int answer = 0, sum = 0; map m; for (const auto& val : tangerine) m[val]++; 주어진 벡터에 있는 원소들의 개수를 파악하기 위해 map 자료구조를 활용하였다. 이때 맵은 귤의 크기를 키로 하..

[백준] 8979 올림픽 with C++

문제설명 입출력 예제 개념 올림픽에서 메달 획득 별 등수를 출력하는 문제다. 올림픽 메달 순위에서는 동점의 경우 같은 등수를 가지며, 그다음 등수는 동점인 나라의 수를 고려하여 건너뛰게 된다. 예를 들어, 금메달 수가 1개인 나라가 1등에 2개가 있다면, 그다음 나라는 3등이 된다. 이러한 동점 상황을 고려하여 문제를 풀면 해결할 수 있다. 풀이 #include #include #include using namespace std; struct medal { int _id, _gold, _silver, _bronze; bool operator > (const medal& m) const { if (_gold != m._gold) return _gold > m._gold; else if (_silver !=..

Algorithm/백준 2023.06.25

[알고리즘] 벨만-포드 알고리즘

벨만-포드 알고리즘개요 이전 게시물들에서는 그래프 내의 두 정점 사이의 최단 경로를 찾는 방법들에 대해 다루었다. 특히 가중치가 부여된 그래프에서 최단 경로를 찾는 대표적인 방법인 다익스트라 알고리즘은 그리디 알고리즘의 원리를 활용해 각 단계에서 최단 경로를 계산한다. 이 방법은 효율성 면에서 뛰어나지만, 한 가지 큰 제약 사항이 존재하는데, 바로 음의 가중치를 가진 에지를 처리할 수 없다는 점이다. 다익스트라 알고리즘이 음의 가중치를 처리하지 못하는 이유는 그 알고리즘의 핵심 원리에 있다. 이 알고리즘은 '현재까지 발견된 최단 경로'를 기반으로 작동한다. 그리고 이 경로는 더 이상 개선될 수 없다고 가정한다. 즉, 한 번 '최단'으로 판단된 경로는 그 이후에 변경되지 않는다.  하지만 음의 가중치가 그..

CS/알고리즘 2023.06.23

[백준] 1026 보물 with C++

문제설명 입출력 예제 개념 배열 A와 B를 받아, 두 배열의 곱의 합 A[i] * B[i]의 합의 최솟값을 구하는 문제다. 이는 A 배열의 최솟값과 B 배열의 최댓값을 곱하면 쉽게 해결할 수 있다. 이를 엄밀히 증명하면 다음과 같다. a ≤ b 그리고 c ≤ d를 가정하면 (여기서 a, b, c, d는 임의의 실수입니다), 이때 다음 부등식이 성립한다 ac + bd ≤ ad + bc 이 부등식은 다음과 같이 변환된다. ac + bd - ad - bc ≤ 0 => ac - ad + bd - bc ≤ 0 => a(c - d) + b(d - c) ≤ 0 => (a - b)(c - d) ≤ 0 이제 우리가 얻은 부등식에 두 배열의 원소들을 대입해보자. 배열 A와 B가 주어지고, A의 원소 a, b (a ≤ b)..

Algorithm/백준 2023.06.23

[프로그래머스] 소수 찾기 with C++

문제 설명 제한 사항 및 입출력 예제 개념 이 문제는 주어진 문자열에서 추출 가능한 모든 숫자 조합 중 소수가 몇 개 있는지를 찾는 문제다. 이 문제를 해결하기 위해서는 두 가지 주요 과정이 필요하다. 먼저 가능한 모든 숫자 조합을 생성해야 한다는 것이다. 이 과정에서 문자열의 순열을 찾는 개념을 사용한다. 즉, 주어진 문자열의 모든 문자를 사용하여 만들 수 있는 모든 숫자 조합을 배열에 담는다. 두 번째는 소수를 판별하는 것이다. 생성된 모든 숫자 조합을 순회하며 소수인지 판별한다. 문제를 해결하는 과정에서 주의해야 할 점은 동일한 숫자가 두 번 이상 카운트되면 안 된다는 점이다. 예를 들어 "11"은 "1"이 두 번 등장하므로 소수인 11이 두 번 카운트되어서는 안 된다. 이 문제는 중복을 허용하지 ..

[프로그래머스] 행렬의 곱셈 with C++

문제 설명 제한 사항 및 입출력 예제 개념 행렬의 곱셈을 구현하는 비교적 간단한 알고리즘이다. 행렬의 곱셈을 수행하려면 몇 가지 기본적인 규칙과 조건이 필요하다. 예를 들어, n1 * m1 행렬A, n2 * m2 행렬B가 존재할 때 두 행렬의 곱셈이 이루어지기 위해선 차원 일치: m1 = n2 결과 행렬의 크기: 행렬A * 행렬B = 행렬C일 때, 행렬 C의 크기는 n1 * m2 곱셈 규칙: C[i][j] = A[i][k] * B[k][j] 와 같은 조건들이 필요하다. 풀이 #include using namespace std; vector solution(vector ary1, vector ary2) { vector answer(ary1.size()); int sum = 0; for (int i = 0;..

[백준] 1197 최소 스패닝 트리 with C++

문제설명 입출력 예제 개념 최소 신장 트리 문제다. 주어진 그래프에서 가중치의 합이 최소가 되는 트리를 찾는 것이므로, MST 알고리즘 중 크루스칼 알고리즘을 이용해서 풀면 해결할 수 있다. 이때 Kruskal 알고리즘은 모든 간선들의 가중치를 오름차순으로 정렬하고, 가장 가중치가 작은 간선부터 연결해 나가면서 MST를 만들어 나가는 알고리즘이다. 풀이 #include #include #include using namespace std; int findParent(int parent[], int node) { while (parent[node] != node) node = parent[node]; return node; } void unionParent(int parent[], int a, int b) ..

Algorithm/백준 2023.06.17

[알고리즘] 다익스트라 최단 경로 알고리즘

다익스트라 알고리즘개요 그래프에서 단일 시작 최단 경로 문제는 시작 정점과 목적 정점이 주어졌을 때, 시작 정점에서 목적 정점까지 이어지는 최소 비용 경로를 찾는 문제다. 이 문제를 해결하는 여러 알고리즘 중 하나가 다익스트라 알고리즘(Dijkstra's algorithm)이다.  다익스트라 알고리즘은 음수 가중치를 갖지 않는 그래프에서 사용되는 최단 경로 탐색 알고리즘이다. 이 알고리즘은 프림의 최소 신장 트리(MST) 알고리즘을 변형한 것으로, 다음과 같은 절차를 따른다. 시작 노드를 설정시작 노드의 거리 값은 0으로, 이를 제외한 모든 노드의 거리 값은 무한대로 초기화모든 거리 값을 최소 힙에 추가최소 힙으로부터 꺼낸 정점 U와 인접한 모든 정점 V에 대해, 만약 V의 거리 값이 (U의 거리 값 +..

CS/알고리즘 2023.06.17

[백준] 9372 상근이의 여행 with C++

문제설명 입출력 예제 개념 이 문제는 모든 국가가 연결되어 있고, 모든 비행기 티켓 가격이 동일하다는 특성 때문에 최소 신장 트리 문제처럼 보일 수 있다. 하지만 여기서 중요한 점은 상근이가 한 국가에서 다른 국가로 이동할 때, 필요에 따라 다른 국가를 거쳐갈 수 있다는 것이다. 이는 실질적으로 모든 비행기를 직접 타고 갈 필요가 없다는 것을 의미한다. 따라서 이 문제의 답은 MST 알고리즘을 사용하지 않고도 간단히 구현할 수 있다. 상근이가 모든 국가를 여행하기 위해서는 전체 국가의 수 - 1 만큼의 비행기를 타면 된다. 왜냐하면 한 국가에서 출발해 모든 다른 국가를 방문하려면, 국가의 수보다 비행기를 하나 적게 타면 되기 때문이다. 풀이 #include using namespace std; int m..

Algorithm/백준 2023.06.16

[알고리즘] 프림 알고리즘

프림의 최소 신장 트리 알고리즘프림 알고리즘 프림 알고리즘(Prim's Algorithm)은 최소 신장 트리 문제를 해결하는 그리디 알고리즘 중 하나다. 그래프의 임의의 정점에서 시작하여, 그래프의 모든 정점을 포함하고 모든 간선의 가중치 합이 최소인 트리를 찾는 알고리즘으로서, BFS의 동작 방식과 유사하다. 동작 과정은 다음과 같다. 시작 노드를 선택하고, 선택한 정점을 트리에 추가선택한 노드에 인접하고 트리에 연결되지 않은 노드로 연결된 간선들 중, 가장 작은 가중치를 가진 간선을 추가그래프의 모든 노드가 트리에 추가될 때까지 반복예시  다음과 같은 그래프가 있다고 가정하고, 이러한 그래프에 프림 알고리즘을 적용하여 최소 신장 트리를 구하는 과정을 살펴보자.    먼저 시작 정점을 제외하고, 모든 ..

CS/알고리즘 2023.06.15