본문 바로가기
  • Let's study

알고리즘/C++14

[C++] 문자열 분리하기(split) C++에서는 문자열을 분리하는 함수가 따로 없어서 직접 구현해야 한다. 코드는 아래와 같다. #include #include using namespace std; int main() { string str = "Hello World!"; //구분할 문자열 istringstream ss(str); //istringstream에 저장 string buffer; //분리된 문자열을 담는 변수 while (getline(ss, buffer, ' ')) { //' '을 기준으로 분리 후 출력 cout 2023. 10. 14.
[알고리즘] 백트레킹 백트래킹이란? 해를 얻을 때까지 모든 경우의 수를 시도하는 알고리즘이다. 규칙을 적용하여 얻은 결과가 틀리면 그 규칙을 적용한 다음부터 현재까지의 결과를 무시하고 이전으로 돌아가서 다른 규칙을 선택하여 다시 시도한다. 보통 DFS를 사용해서 탐색하면서 조건을 통해 필요 없는 부분을 쳐낸다. 백트래킹 예시 N-Queen 문제가 가장 대표적인데, 예시로 너무 많이 나와서 다른 문제를 준비해봤다. N과 M (1) 자연수 N과 M이 주어졌을 때, 아래 조건을 만족하는 길이가 M인 수열을 모두 구하는 프로그램을 작성하시오. - 1부터 N까지 자연수 중에서 중복 없이 M개를 고른 수열 해결방법 해당 숫자를 골랐는지의 유무를 저장하는 visited 배열을 사용하여 1부터 고르지 않은 숫자를 찾아 arr 배열에 저장한.. 2023. 10. 5.
[알고리즘] 다익스트라 다익스트라 알고리즘이란? 다익스트라는 그래프에서 한 정점에서 다른 정점까지의 최단 경로를 구하는 알고리즘이다. 최단 경로 구하는 과정 출발점으로부터의 최단거리를 저장할 배열 d[v]를 만들고, 출발 노드에는 0을, 출발점을 제외한 다른 노드들에는 매우 큰 값 INF를 채워 넣는다. A로부터 갈 수 있는 임의의 노드 B에 대해, d[A] + P[A][B](가중치)와 d[B]의 값을 비교한다. d[A] + P[A][B] < d[B] 라면, d[B] = d[A] + P[A][B]로 갱신시킨다. A의 모든 이웃 노드 B에 대해 이 작업을 수행한다. A의 방문 상태를 TRUE로 바꾼다. 방문하지 않은 모든 노드들 중, 출발점으로부터의 거리가 제일 짧은 노드를 다시 A로 지정한다. 도착 노드의 방문 상태가 TRUE.. 2023. 10. 2.
[알고리즘] 이분 탐색 이분 탐색 알고리즘이란? 정렬되어 있는 리스트에서 탐색 범위를 절반씩 줄여가며 원하는 데이터를 탐색하는 알고리즘이다. 정렬된 리스트에서 중간 값을 선택하고 선택한 값과 찾고자 하는 값의 크고 작음을 비교한다. 선택한 중간값이 만약 찾는 값보다 크면 그 값은 새로운 최댓값이 되며, 작으면 그 값은 새로운 최솟값이 된다. 꼭 정렬해야함을 잊지 말자! 이분 탐색 알고리즘 구현 - C++ 이분 탐색은 O(log N) 의 시간복잡도를 가진다. #include using namespace std; int main(){ int arr[10]={1,2,3,4,5,6,7,8,9}; int target=6; int low=0, high=9;//시작 인덱스, 끝 인덱스 int res=0; //이분탐색 부분 while(low.. 2023. 10. 1.
[알고리즘] 탐욕(그리디) 알고리즘 그리디 알고리즘이란? 탐욕적 알고리즘이라고도 하며, 여러 경우 중 하나를 결정해야 할 때마다 그 순간에 최적이라고 생각되는 것을 선택해 나가는 방식으로 진행하여 최종적인 해답에 도달한다. A에서 C까지 가는 최단 경로는? A에서 B로 갈 때 가장 적은 비용인 20을 고른다. B에서 C로 갈 때 가장 적은 비용인 8을 고른다. A에서 C로 가는 최단 경로는 20+8=28인 것을 알 수 있다! 이 문제는 선택의 순간마다 가장 적은 비용이 드는 길을 찾아가는 방법으로 풀 수 있었다. 아래의 문제도 위와 같이 그때그때 가장 최적의 값을 고르는 방법으로 풀어야 할까? 총 합이 최대의 값을 얻는 방법은? 위의 방법처럼 그때그때 최적의 값을 골라보자. start에서 시작하여 최대의 값을 얻어야 하니 15로 가보자. .. 2021. 11. 1.
[알고리즘] 병합 정렬 - C++ 병합 정렬 #include using namespace std; int temp[6]; int arr[] = { 4, 2, 6, 1, 5, 3 }; void merge(int start, int end) { int mid = (start + end) / 2; int i = start, j = mid + 1, k = start; while (i 2021. 9. 22.