백준 75

[백준] 2217 로프 with C++

문제설명 입출력 예제 개념 각 로프는 고유한 중량 한계를 가지고 있으며 이를 초과할 수 없다. 이때 로프 2개가 각각 10kg, 15kg을 버틸 수 있다고 하면, 10kg 한 개를 쓸 땐 10kg, 15kg 한 개를 쓸 땐 15kg, 10kg과 15kg을 함께 쓰면 각 로프가 10kg씩 버틸 수 있으므로 20kg를 버틸 수 있다. 이러한 특징에 착안하여 로프들을 강도에 따라 정렬하여 가장 강한 로프부터 시작하여 점점 약한 로프를 추가하며, 각 단계에서의 최대 중량을 계산할 수 있다. 이때 로프들 중 일부만을 선택해야 할 경우도 고려해야 한다. 예를 들어, 10, 20, 30, 40, 50kg을 버틸 수 있는 로프 5개가 있다고 가정해 보자. 1. 50kg: 50kg 2. 50kg, 40kg: 40 + 4..

Algorithm/백준 2024.03.08

[백준] 1015 수열 정렬 with C++

문제설명 입출력 예제 개념 원본 수열에서 정렬을 적용한 후, 각 원소가 원래 있던 위치에서 어떤 위치로 이동하였는지 확인하는 문제다. 즉, 원본 수열의 원소들이 정렬된 후의 위치 값을 찾는 문제다. 유의해야 할 점은, 중복된 원소의 값을 처리하는 것이다. 이는 동일한 원소의 경우 원본 수열에서 사전순으로 앞서는 것을 출력해야 한다는 것을 의미한다. 따라서 각 원소의 값을 그 원소의 원래 위치와 함께 저장하는 pair 자료형을 사용하여 해결할 수 있다. 또한, 오름차순을 정렬할 때 정렬 후에 동일한 값의 원소들 사이의 상대적인 순서를 유지하기 위해 stable_sort를 사용해야 한다. 풀이 #include #include #include using namespace std; bool custom(pair..

Algorithm/백준 2023.08.02

[백준] 1013 Contact With C++

문제설명 입출력 예제 개념 주어진 문자열에서 특정 패턴을 찾는 문제다. C++에서 문자열에서 특정 패턴을 찾는 데 사용할 수 있는 주요 라이브러리로는 정규 표현식(Regex) 라이브러리 regex가 있다. 이는 문자열 검색 알고리즘이 사용할 수 있는 템플릿으로 작동한다. 이를 이용하여 문자열에서 특정 내용을 찾거나 대체하거나, 입력된 문자열이 특정 패턴과 일치하는지 확인하는 등의 작업을 수행할 수 있다. 정규 표현식의 구문 중 문제에서 제시하는 표현들은 다음과 같다. abc: 정확히 abc와 일치하는 문자열을 찾는다 a+: a가 1번 이상 반복되는 문자열을 찾는다 (ab)+: ab가 1번 이상 반복되는 문자열을 찾는다 a|b: a또는 b를 찾는다 이를 이용하여 정규 표현식 패턴을 나타내는 클래스인 reg..

Algorithm/백준 2023.08.01

[백준] 1004 어린 왕자 with C++

문제설명 입출력 예제 개념 이 문제는 어린 왕자가 출발점에서 목표점까지 지나가야 하는 최소 행성계의 수를 찾는 문제다. 각 행성계는 2차원 평면에서 원으로 표현된다. 이 문제를 풀기 위한 핵심 개념은 다음과 같다. 1. 원의 내부에 점이 위치하는지 확인: 이 문제를 해결하기 위해서는 주어진 점이 원 안에 있는지를 확인해야 한다. 이를 위해 거리 계산 공식을 사용하면 된다. 주어진 점 (x, y)와 원의 중심 (x1, x2) 사이의 거리는 sqrt((x-x1)^2 + (y-x2)^2)로 계산하고, 이 값이 원의 반지름 r보다 작거나 같으면 점은 원 내부에 있다. 2. 출발점과 도착점이 동일한 원에 있는 경우: 문제에서는 출발점과 도착점이 동일한 원 안에 있을 경우, 어린 왕자가 그 원을 지나가지 않고 무시..

Algorithm/백준 2023.07.28

[백준] 1002 터렛 with C++

문제설명 입출력 예제 개념 이 문제는 원의 방정식을 이용하여 해결할 수 있다 된다. 즉, 조규현의 좌표에서 목표인 류재명까지의 거리를 반지름으로 하는 원과, 백승환의 좌표에서 목표까지의 거리를 반지름으로 하는 원을 그린 후, 두 원의 교점의 개수를 구하면 문제를 해결할 수 있다. 따라서 두 원의 교점의 개수를 구하는 관계를 파악하기 위해, 두 원 사이의 거리를 이용할 수 있다. 이는 교점이 2개, 1개, 0개, 무한개일 때로 나눌 수 있다. 이때 두 원의 반지름을 각각 r1, r2라고 하고, 두 원의 중점 사이의 거리를 d라고 할 때 다음이 성립한다. 교점이 무한 개: d = 0 교점이 0개: r1- r2 < d < r1 + r2 교점이 1개: d = r1 ± r2 교점이 2개: d < r1 + r2 이..

Algorithm/백준 2023.07.20

[백준] 1094 막대기 with C++

문제설명 입출력 예제 개념 이 문제는 64cm 막대기를 이용하여 길이가 Xcm인 막대기를 만드는 문제다. 이때, 우리가 사용할 수 있는 도구는 막대기를 정확히 절반으로 자르는 것뿐이다. 따라서, 가능한 막대기의 길이는 64, 32, 16, 8, 4, 2, 1cm 등 2의 거듭제곱 형태다. 이는 우리가 풀려고 하는 문제를 이진수 표현으로 해석하는 키가 된다. 각 이진수의 자리는 2의 거듭제곱을 나타내며, 우리가 필요한 막대의 개수는 이진수 표현에서 1의 개수와 같다. 이는 막대기를 사용하느냐, 사용하지 않느냐를 이진수의 1과 0으로 표현한 것과 같다. 이런 점에서 볼 때, 이 문제는 그리디 알고리즘을 사용하여도 풀 수 있다. 그리디 알고리즘을 사용하는 경우, 가장 큰 막대부터 시작하여 목표 길이를 초과하지..

Algorithm/백준 2023.07.04

[백준] 14725 개미굴 with C++

문제설명 입출력 예제 개념 부모 노드를 기준으로 트리가 어떻게 구성되어 있는지 파악하는 문제다. 문자열을 효율적으로 관리하는 트라이(trie) 자료 구조를 활용하거나, 트리를 구성해 DFS 탐색을 이용해 문제를 풀어도 되지만, 필자는 set의 자동 정렬 특성을 이용해 모든 문자열 경로를 알파벳 순서로 정렬하고, 이에 해당하는 구조를 출력하는 방식으로 문제를 해결하였다. 풀이(1) #include #include #include using namespace std; int main() { int N, n; cin >> N; set s; while (N--) { string tmp, str; cin >> n; while (n--) { cin >> tmp; str += ' ' + tmp; s.insert(st..

Algorithm/백준 2023.06.29

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

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