C++ 16

[Boj] 백준 C++ #1202 보석 도둑

📍문제 링크https://www.acmicpc.net/problem/1202 📍알고리즘 분류그리디, 우선순위 큐 📍 풀이 방법최대한 많은 보석을 훔치기 위해서는 최대한 비싼 보석을, 많이 담아야 한다.따라서 비싼 보석부터 담아야 하는데, 최대로 용량을 채울 수 있는 가방에 넣어야 한다.반복문을 통해 가방을 하나씩 그리디하게 보면서 넣을 보석을 정해준다.우선순위 큐를 이용해서 하나의 가방 안에 들어갈 수 있는 무게의 보석들 중 가격이 가장 비싼 것을 담으면 된다. 어떤 가방부터 보아야할까?용량이 큰 가방부터 본다면, 비싼데 크기가 작은 보석이 용량이 큰 가방에 담길 것이다. 더 보석을 가져갈 수 있을텐데 용량이 낭비될 것이다.따라서 용량이 작은 가방부터 탐색한다. 작은 가방에 담기는 무게 중에서 비싼..

Boj 2024.12.27

[알고리즘] 정렬알고리즘 #6 힙 정렬 (Heap Sort)

📍 힙 정렬 (Heap Sort)힙 소트는 힙 구조를 이용해 정렬하는 알고리즘이다.힙 구조란 완전 이진 트리의 일종인 자료구조로 MaxHeap과 MinHeap이 있다. MaxHeap은 루트노드가 가진 값은 자식 노드가 가진 값보다 크거나 같다. MinHeap은 반대로 루트노드가 자식노드보다 작거나 같다. 힙 소트에서는 MaxHeap을 사용한다.1) 정렬되지 않은 배열을 힙 구조로 바꾼다. (construct heap)2) 최상위 루트 노드를 뽑아 가장 마지막 원소와 교체한다. (extract)3) 루트노드부터 마지막 원소 전까지 heap구조로 만든다. (heapify / fixheap)4) 2)로 돌아가 모든 노드를 추출할 때까지 반복한다. 📍 C++ 구현 코드class Solution {public..

알고리즘 2024.10.23

[알고리즘] 정렬알고리즘 #5 퀵 정렬 (Quick Sort) - Romuto, Hoare

📍 퀵 정렬 (Quick Sort)퀵 정렬은 빠르다고 해서 퀵 정렬이다. 먼저 퀵 소트의 기본 흐름은 아래와 같다.1) 가장 왼쪽 원소를 pivot으로 선정 (pivot 선정 방식은 바꿀 수 있음)2) 배열 내 원소들을 pivot보다 작은 것 / pivot보다 큰 것 이렇게 두 개로 분류3) 각각의 배열 내에서 다시 1)부터 반복 (recursive) 📍 C++ 구현 코드퀵소트를 구현하는 방식에는 Romuto의 방식, Hoare의 방식 두 개가 있다. 각 방식의 코드가 아래에 순서대로 있다. // Romutoclass Solution {public: void quicksort(vector& nums, int start, int end){ if(start sortArray(vector..

알고리즘 2024.10.23

[알고리즘] 정렬알고리즘 #4 합병정렬 (Merge Sort)

📍 합병정렬 (Merge Sort)합병 정렬은 Divide & Conquer (분할정복) 방식을 기반으로 한 정렬이다. 배열을 쪼개고 쪼갠 뒤 합치는(merge) 과정에서 정렬이 된다. 그래서 Merge Sort이다. 📍 C++ 구현 코드class Solution {public: void merge(vector& nums, int start, int mid, int end){ int n = nums.size(); vector tmp(n+1); for(int i=0;i& nums, int start, int end){ if(start sortArray(vector& nums) { mergesort(nums,0,nums.size()-1)..

알고리즘 2024.10.23

[알고리즘] 정렬알고리즘 #3 버블정렬 (Bubble Sort)

📍 버블정렬 (Bubble Sort) 🫧버블 정렬은 정렬되는 모습이 버블버블하다.앞에서부터 계속 바로 이웃한 원소와 스왑스왑스왑스왑해서 맨 뒤에 가장 큰 원소를 넣어둔다. 그 다음엔 다시 처음부터 스왑스왑스왑스왑해서 n-2에도 가장 큰 원소를 넣는다. 계속 이웃한 원소에서 swap을 진행하면서 나아가기 때문에 전반적으로 앞에서부터 뒤까지 정렬이 조금씩 조금씩 진행되고, 정확한 정렬은 맨 뒤에서부터 하나씩 진행된다. 전반적으로 정렬이 되기 때문에 버블버블하게 거품이 올라오는 듯하다. 📍 C++ 구현 코드class Solution {public: vector sortArray(vector& nums) { int n = nums.size(); for(int i=n-2;i>=..

알고리즘 2024.10.22

[알고리즘] 정렬알고리즘 #2 선택정렬 (Selection Sort)

📍 선택정렬 (Selection Sort)가장 작은 값을 찾아 선택한다. 정렬되지 않은 배열의 첫 번째 원소부터 현재 원소이고, 그 뒤의 모든 원소를 비교해가며 가장 작은 원소를 찾는다. 가장 작은 원소를 현재 원소와 교체한다. 그러면 점점 앞에서부터(가장 작은 수부터) 순서대로 정렬되어간다.우리가 실제로 실물 카드를 정렬한다고 했을 때, 선택정렬을 사용할 사람은 없을 것 같다. 가장 작은 수를 찾아서 앞에다가 놓아가며 정렬하는 원리이지만 가장 작은 수를 맨 첫 번째 원소와 교체하기 때문이다. 우리가 실물 카드를 가지고 있다면 교체가 아니라 그냥 작은 수를 앞에다가 놓았을 것이다. 하지만 프로그램으로 구현하려면 원소의 자리를 채워주기 위해 교체가 필요했다. 실제 세상에서 사용되지는 않지만 프로그램으로 ..

알고리즘 2024.10.22

[알고리즘] 정렬알고리즘 #1 삽입정렬 (insertion Sort)

📍 삽입 정렬 (Insertion Sort)삽입 정렬은 실제로 내가 카드를 가지고 있다고 생각하면 더 이해가 쉬운 것 같다. 정렬되지 않고 나열된 카드 중 두 번째 카드를 들어 손에 쥔다. 그러면 내가 두 번째 카드를 들고 있으므로 두 번째 칸이 빌 것이다. 바로 앞의 카드와 비교하여 내가 들고 있는 카드보다 크다면 앞 카드를 한 칸 뒤로 민다. 해당 카드 바로 뒤는 비어있다. 카드를 밀어서 빈 공간을 채워주면 된다. 이를 반복하다가 내가 들고 있는 카드보다 큰 카드가 나오면 지금 빈 공간에 내가 들고 있는 카드를 내려놓는다.우리가 실제로 숫자카드를 가지고 정렬하고자 할 때 사용하곤 하는 직관적인 방법이라고 생각할 수 있다. 📍 C++ 구현 코드class Solution {public: vect..

알고리즘 2024.10.22

[알고리즘] 부분수열의 최대합 Maximum Subsequence Sum

Maximum Contiguous Subsequence Sumn개의 정수 a1, a2, ..., an이 주어졌을 때 연속적인 부분수열의 합이 최대가 되는 구간의 합을 계산하시오.리트코드 사이트의 문항을 이용해 코드로 연습해보았다.https://leetcode.com/problems/maximum-subarray/📍 [방법1] Brute-force가능한 모든 부분 수열에 대해서 계산을 하고 이 중 가장 큰 합을 찾는다. index i는 부분 수열의 시작 인덱스를, j는 마지막 인덱스를 의미한다. 단순하지만 O(n^3)만큼의 시간복잡도를 가진다. 매우 효율적이지 않다.class Solution {public: int maxSubArray(vector& nums) { int n = nums..

알고리즘 2024.10.21

[Boj] 백준 C++ #11726 2xn 타일링

📍알고리즘 분류: DP 동적 프로그래밍큰 문제를 작은 문제로 나눌 수 있으며 작은 문제에서 구한 정답은 그것을 포함하는 큰 문제에서도 동일할 경우 DP를 사용한다.📍문제 풀이:처음에는 조합(Combination)을 이용한 수식으로 문제에 접근했다. 문제에서 높이는 2로 고정되어 있으므로 2xn 타일을 쪼개보면 타일을 구성할 수 있는 경우는 '2x1' 혹은 '1x2 두개를 위아래로 붙인 2x2' 뿐이다. 그래서 2x1의 모양을 A, 2x2의 모양을 B라고 하자.A는 가로를 1만큼 차지하고 B는 한번에 2만큼 차지한다. 따라서 2xn의 모양에서 n = (1 x A의개수) + (2 x B의개수)라는 수식을 세울 수 있다. A와 B의 범위는 0과 자연수이다. 따라서 A와 B의 순서쌍 조합을 구하면 이 과정에..

Boj 2024.08.11

[Boj] 백준 C++ #2667 단지번호붙이기

📍알고리즘 분류: DFS, BFSDFS란 Depth First Search, 깊이 우선 탐색. 트리나 그래프에서 한 루트로 탐색하다가 특정 상황에서 최대한 깊숙이 들어가서 확인한 뒤 다시 돌아가 다른 루트로 탐색하는 방식이다. 재귀호출이나 스택 배열로 구현할 수 있다.📍문제풀이: 재귀호출 방식의 DFS로 문제를 풀었다. dfs가 처음 호출되면 인접한 집들을 다 탐색하여 한 단지를 구성하는 집의 개수를 모두 센다.📍코드#include #include #include #include using namespace std;#define MAX_N 26int map[MAX_N][MAX_N];bool visited[MAX_N][MAX_N];int dx[4] = {-1,1,0,0};int dy[4] = {0,0..

Boj 2024.08.11