Algorithm 100

[백준] 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

[백준] 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

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

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

Algorithm/백준 2023.06.16

[백준] 1655 가운데를 말해요 with C++

문제설명 입출력 예제 개념 이 문제는 각 숫자를 입력받을 때마다 중간값을 계산하고 출력하는 것이다. 단순하게 배열에 값을 추가하고, 매 반복마다 중앙값을 출력하려면 시간 복잡도가 O(N^2)이 되어 시간 초과가 발생할 수 있다. 이를 해결하기 위한 최적화된 알고리즘이 두 힙 알고리즘이다. 두 힙 알고리즘은 최대 힙과 최소 힙을 이용한다. 이 방식에서는 현재까지 입력받은 수 중 중간값 이하의 수를 최대 힙에, 중간값 초과의 수를 최소 힙에 저장한다. 따라서 중간값은 항상 최대 힙의 루트에 위치하게 된다. 이 알고리즘의 각 연산은 로그 시간 복잡도를 가지므로, 전체 시간 복잡도는 입력의 개수에 비례하는 선형 로그 시간 복잡도 O(N logN)를 가지게 된다. 이렇게 해서 큰 입력에 대해서도 효율적으로 문제를..

Algorithm/백준 2023.06.14

[프로그래머스] N개의 최소공배수 with C++

문제 설명 제한 사항 및 입출력 예제 개념 최소 공배수의 개념을 유클리드 호제법을 이용하여 구하는 문제다. 백준 최소 공배수 문제의 연장선으로서, 주어진 벡터의 모든 원소를 순회하며 최소 공배수를 구하면 된다. 풀이 (1) 유클리드 호제법 구현 #include using namespace std; int gcd(int x, int y) { if (y == 0) return x; return gcd(y, x % y); } int lcm(int x, int y) { return x * y / gcd(x, y); } int solution(vector v) { int answer = 1; for (int i = 0; i < v.size(); ++i) answer = lcm(answer, v[i]); retur..

[프로그래머스] 예상 대진표 with C++

문제 설명 제한 사항 및 입출력 예제 개념 다음 그림처럼 토너먼트 브라켓 구조를 띄고 있는 대회에서 A참가자와 B참가자가 무조건 이긴다는 가정 하에 몇 번째 라운드에서 만날지 예측하는 문제다. 배열을 갱신하며 두 특정 참가자가 만나는 시점까지 반복하는 방법과, 두 참가자의 위치를 업데이트하고, 이들이 같아질 때까지 라운드를 증가시키는 방법이 존재한다. 풀이 (1) 배열 갱신 #include using namespace std; int solution(int n, int a, int b) { int cnt = 1; vector v(n, 0), tmp; v[a - 1] = true; v[b - 1] = true; for (int i = 0; i < n; i += 2) { if (v[i] && v[i + 1]..

[백준] 13305 주유소 with C++

문제설명 입출력 예제 개념 최소 비용을 통해 목표를 달성하는 그리드 알고리즘을 활용하는 문제다. 이 문제의 핵심 아이디어는 가장 낮은 기름값을 갖는 주유소를 찾아, 그곳에서 기름을 충전하는 것이다. 따라서 현재 위치에서 다음 도시로 이동하기 위해 필요한 기름을 충전하는데, 현재 주유소의 기름 가격과 다음 주유소의 기름 가격을 비교하여 최소 비용을 항상 유지하게 기름값을 갱신하면 된다. 풀이 #include #include using namespace std; int main() { long long N; cin >> N; vector station(N), road(N-1); for (int i = 0; i > road[i]; for (int i = 0; i < N; ++..

Algorithm/백준 2023.06.11