레이블이 Cpp인 게시물을 표시합니다. 모든 게시물 표시
레이블이 Cpp인 게시물을 표시합니다. 모든 게시물 표시

2023년 7월 3일 월요일

[C++]C++ 피보나치 수열: 정의, 계산 방법 및 구현 예제

이 블로그에서는 C++ 피보나치 수열의 정의와 계산 방법을 알려드리고, C++을 사용하여 피보나치 수열을 구현하는 방법을 상세히 안내합니다.


피보나치 수열은 수학적으로 흥미로운 시퀀스입니다. 이 글에서는 피보나치 수열의 정의와 계산 방법에 대해 알아보고, C++을 사용하여 피보나치 수열을 구현하는 방법을 상세히 안내하겠습니다. 피보나치 수열은 프로그래밍에서 종종 활용되는 중요한 개념이므로, C++ 프로그래밍을 시작하는 사람에게 유용한 정보가 될 것입니다.




1. 피보나치 수열이란?

피보나치 수열은 이전 두 항의 합으로 다음 항을 만드는 수열입니다. 즉, 처음 두 항은 0과 1이며, 그 다음 항부터는 이전 두 항의 합으로 계산됩니다. 따라서 피보나치 수열은 0, 1, 1, 2, 3, 5, 8, 13, 21, ...과 같은 형태로 이어집니다.




2. 피보나치 수열 계산 방법

피보나치 수열을 계산하는 방법에는 여러 가지가 있지만, 가장 간단하고 일반적인 방법은 재귀적인 접근입니다. 다음은 재귀 함수를 사용하여 피보나치 수열을 계산하는 코드입니다.


1
2
3
4
5
6
7
8
9
int fibonacci(int n) {
    // 기저 조건: n이 0이거나 1일 때는 그대로 반환
    if (n == 0 || n == 1) {
        return n;
    }
    
    // n-1번째와 n-2번째 피보나치 수를 더하여 계산
    return fibonacci(n - 1+ fibonacci(n - 2);
}
cs




3. 피보나치 수열 구현 예제

C++을 사용하여 피보나치 수열을 구현하는 방법을 예제로 살펴보겠습니다. 아래 코드는 반복문을 사용하여 피보나치 수열을 계산하는 방법을 보여줍니다


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <iostream>
 
int fibonacci(int n) {
    if (n == 0 || n == 1) {
        return n;
    }
    
    int a = 0;
    int b = 1;
    int result;
    
    for (int i = 2; i <= n; ++i) {
        result = a + b;
        a = b;
        b = result;
    }
    
    return result;
}
 
int main() {
    int n = 10// 계산할 항의 개수
    
    std::cout << "피보나치 수열: ";
    for (int i = 0; i < n; ++i) {
        std::cout << fibonacci(i) << " ";
    }
    
    return 0;
}
cs

위의 코드는 fibonacci() 함수를 사용하여 피보나치 수열을 계산하고, main() 함수에서 피보나치 수열의 처음 10개 항을 출력합니다. 결과는 다음과 같습니다.


1
피보나치 수열: 0 1 1 2 3 5 8 13 21 34
cs




4. 피보나치 수열의 활용

  • 피보나치 수열은 다양한 분야에서 유용하게 활용됩니다. 몇 가지 예시를 들어보면 다음과 같습니다.
  • 자원 할당 문제: 피보나치 수열은 자원 할당 문제와 관련하여 자원의 수와 할당 방법을 결정하는 데 사용될 수 있습니다.
  • 알고리즘 최적화: 동적 계획법 등의 알고리즘에서 피보나치 수열은 최적화에 활용될 수 있습니다.
  • 황금 비율: 피보나치 수열의 연속한 항들의 비율이 근사적으로 황금 비율인 1.618에 수렴한다는 특징을 활용할 수 있습니다.




마무리

이 글에서는 피보나치 수열에 대한 정의와 계산 방법을 소개하고, C++을 사용하여 피보나치 수열을 구현하는 방법을 예제로 안내했습니다. 피보나치 수열은 프로그래밍에서 중요한 개념이며, 다양한 응용 분야에서 활용될 수 있습니다. 이를 통해 C++ 프로그래밍의 기초를 다지고, 알고리즘과 최적화에 대한 이해를 향상시킬 수 있습니다.

2023년 6월 30일 금요일

[C++] 반올림과 반내림 이해하기: 코드 예제로 배우는 기초 이론

이 글에서는 C++에서의 반올림과 반내림에 대해 배워보고, 이를 사용하는 방법에 대해 설명합니다. 이 두 가지 기법은 금융, 과학 계산, 데이터 분석 등 많은 분야에서 중요하게 사용되며, C++에서는 이를 위한 다양한 함수를 제공하고 있습니다.



안녕하세요, 개발자 여러분. 오늘은 프로그래밍 언어 중 하나인 C++에서의 반올림과 반내림에 대해 배워볼까 합니다. 이 두 개념은 많은 분야에서 굉장히 중요합니다. 예를 들어 금융, 과학 계산, 데이터 분석 등에서는 이를 정확하게 이해하고 사용할 수 있어야 합니다. C++에서는 이를 위한 다양한 방법이 있으며, 이 포스트에서는 그 중 몇 가지를 소개하도록 하겠습니다.




1. 반올림(Rounding)

먼저 반올림에 대해 알아보겠습니다. 반올림은 특정 자릿수에서 더 높은 수 또는 더 낮은 수로 가장 가까운 수로 근사하는 방법입니다. 일반적으로 소수점 다음의 숫자가 5 이상이면 올림하고, 그렇지 않으면 내림합니다.


C++에서는 라이브러리에 있는 round() 함수를 이용해 쉽게 반올림을 할 수 있습니다. 이 함수는 매개변수로 받은 실수를 가장 가까운 정수로 반올림합니다.


다음은 round() 함수의 사용 예제입니다.

1
2
3
4
5
6
7
8
#include <iostream>
#include <cmath>
 
int main() {
    double num = 3.6;
    std::cout << round(num); // 출력: 4
    return 0;
}
cs

이 코드에서는 3.6을 가장 가까운 정수로 반올림하였습니다.



다음 예제는 소수점 이하 둘째 자리에서 반올림하는 코드입니다.

1
2
3
4
5
6
7
8
9
#include <iostream>
#include <cmath>
 
int main() {
    double num = 3.46;
    num = round(num * 10/ 10// 소수점 둘째 자리에서 반올림
    std::cout << num; // 출력: 3.5
    return 0;
}
cs

이 코드에서는 num을 10배하여 소수점 이하 첫 번째 자리를 정수 부분으로 옮긴 후 round() 함수로 반올림하고 다시 10으로 나누어 원래의 위치로 돌려놓았습니다.




2. 반내림(Truncation)

이번에는 반내림에 대해 알아보겠습니다. 반내림은 특정 자릿수에서 무조건 낮은 수로 가장 가까운 수로 근사하는 방법입니다. 이는 라이브러리의 trunc() 함수를 이용하면 됩니다.

다음은 trunc() 함수를 사용하는 예제입니다.

1
2
3
4
5
6
7
8
#include <iostream>
#include <cmath>
 
int main() {
    double num = 3.6;
    std::cout << trunc(num); // 출력: 3
    return 0;
}
cs

이 코드에서는 3.6을 가장 가까운 정수로 반내림하였습니다.



다음은 소수점 이하 둘째 자리에서 반내림하는 코드입니다.

1
2
3
4
5
6
7
8
9
#include <iostream>
#include <cmath>
 
int main() {
    double num = 3.46;
    num = trunc(num * 10/ 10// 소수점 둘째 자리에서 반내림
    std::cout << num; // 출력: 3.4
    return 0;
}
cs

이 코드에서도 num을 10배하여 소수점 이하 첫 번째 자리를 정수 부분으로 옮긴 후 trunc() 함수로 반내림하고 다시 10으로 나누어 원래의 위치로 돌려놓았습니다.




이처럼 C++에서는 라이브러리를 활용하여 쉽게 반올림과 반내림을 수행할 수 있습니다. 이 포스트가 여러분의 프로그래밍 스킬 향상에 도움이 되었기를 바랍니다.

[C++]C++를 이용한 깊이 우선 탐색(DFS) 기본 개념부터 구현까지

이 글에서는 C++을 이용한 깊이 우선 탐색(DFS)에 대한 기본 개념부터 구현 방법, 그리고 실제 활용 예시까지를 다룹니다. 초보자도 쉽게 이해할 수 있도록 설명되어 있으니, 그래프 알고리즘을 학습하시는 분들께 도움이 될 것입니다.
안녕하세요, C++ 프로그래밍에 관심이 많으신 분들께, 깊이 우선 탐색(Depth First Search, 이하 DFS)에 대해 소개하려 합니다. 그래프 탐색 알고리즘 중 하나인 DFS는 다양한 상황에서 활용되며, 특히 노드의 전체 탐색이 필요할 때 매우 유용합니다. 이 글에서는 DFS의 기본 개념부터 C++ 코드를 통한 실제 구현, 그리고 이를 활용한 다양한 문제 해결까지 알아보겠습니다.




1. 깊이 우선 탐색(DFS)이란?

DFS는 그래프의 모든 노드를 방문하는 방법 중 하나입니다. "깊이 우선"이란 이름에서 알 수 있듯이, 먼저 가장 깊은 곳의 노드를 우선적으로 방문하는 방식을 사용합니다. DFS는 트리나 그래프의 전체 탐색, 연결 요소(Connected Component)의 개수 계산, 싸이클 판별 등 다양한 문제를 해결하는 데 사용됩니다.


DFS는 다음의 단계를 거쳐 진행됩니다.

  • 시작 노드를 스택에 넣어주고 방문 처리를 합니다.
  • 스택의 최상단 노드에서 아직 방문하지 않은 인접 노드가 있으면 그 노드를 스택에 넣고 방문 처리합니다. 방문하지 않은 인접 노드가 없으면 스택에서 최상단 노드를 꺼냅니다.
  • 더 이상 2번의 과정을 수행할 수 없을 때까지 반복합니다.




2. C++로 DFS 구현하기

DFS는 재귀 함수나 스택을 이용하여 구현할 수 있습니다. C++에서 기본적인 DFS를 구현하는 방법을 먼저 살펴봅시다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include<bits/stdc++.h>
using namespace std;
 
vector<bool> visited;
vector<vector<int>> graph;
 
// DFS 함수 정의
void dfs(int node) {
    visited[node] = true// 방문 처리
    cout << node << ' ';
    
    for(int i = 0; i < graph[node].size(); i++) {
        int next = graph[node][i];
        if(!visited[next]) {
            dfs(next); // 다음 노드 방문
        }
    }
}
 
int main() {
    // 그래프 초기화
    int n = 8// 노드의 수
    graph.resize(n);
    visited.resize(n, false);
    
    // 그래프 간선 정보 입력
    graph[1].push_back(2);
    graph[1].push_back(3);
    graph[2].push_back(4);
    graph[2].push_back(5);
    graph[3].push_back(6);
    graph[3].push_back(7);
    
    dfs(1); // DFS 실행
    return 0;
}
cs

위의 코드에서 dfs 함수는 시작 노드를 인자로 받아 해당 노드와 연결된 모든 노드를 탐색합니다. 이때, 노드의 방문 여부를 확인하기 위해 visited라는 벡터를 사용하며, 아직 방문하지 않은 노드에 대해 재귀적으로 dfs 함수를 호출합니다.




3. DFS 활용 예제

이제 실제 문제 해결에 어떻게 DFS를 활용하는지 살펴보겠습니다. 두 가지 예제를 통해 DFS를 활용하는 방법을 알아봅시다.


예제 1: 연결 요소의 개수 계산

그래프의 연결 요소란 그래프 내에서 노드들이 서로 연결되어 있는 부분 집합을 말합니다. DFS를 이용하면 간단하게 연결 요소의 개수를 계산할 수 있습니다. 아래 코드를 살펴봅시다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include<bits/stdc++.h>
using namespace std;
 
vector<bool> visited;
vector<vector<int>> graph;
int component = 0// 연결 요소의 개수
 
void dfs(int node) {
    visited[node] = true;
    
    for(int i = 0; i < graph[node].size(); i++) {
        int next = graph[node][i];
        if(!visited[next]) {
            dfs(next);
        }
    }
}
 
int main() {
    int n = 8;
    graph.resize(n);
    visited.resize(n, false);
    
    graph[1].push_back(2);
    graph[2].push_back(3);
    graph[4].push_back(5);
    graph[6].push_back(7);
    
    for(int i = 1; i < n; i++) {
        if(!visited[i]) {
            dfs(i);
            component++;
        }
    }
    
    cout << "Number of connected components: " << component << '\n';
    return 0;
}
cs



예제 2: 경로 찾기

DFS는 그래프 내의 두 노드 사이의 경로를 찾는데도 사용됩니다. 아래 코드를 살펴봅시다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include<bits/stdc++.h>
using namespace std;
 
vector<bool> visited;
vector<vector<int>> graph;
vector<int> path;
 
void dfs(int node, int destination) {
    visited[node] = true;
    path.push_back(node);
    
    if(node == destination) {
        for(int i = 0; i < path.size(); i++) {
            cout << path[i] << ' ';
        }
        cout << '\n';
    } else {
        for(int i = 0; i < graph[node].size(); i++) {
            int next = graph[node][i];
            if(!visited[next]) {
                dfs(next, destination);
            }
        }
    }
    
    path.pop_back();
    visited[node] = false;
}
 
int main() {
    int n = 8;
    graph.resize(n);
    visited.resize(n, false);
    
    graph[1].push_back(2);
    graph[1].push_back(3);
    graph[2].push_back(4);
    graph[2].push_back(5);
    graph[3].push_back(6);
    graph[3].push_back(7);
    
    dfs(16); // 경로 찾기
    return 0;
}
cs




마치며

DFS는 그래프에서 중요한 탐색 알고리즘 중 하나로, 다양한 문제에 활용될 수 있습니다. 이 글에서는 C++을 이용해 DFS를 간단하게 구현해 보았습니다. 그래프와 DFS에 대한 기본적인 이해를 통해, 이 알고리즘을 실제 문제 해결에 활용하실 수 있기를 바랍니다. 항상 즐거운 코딩 되세요!

2023년 6월 29일 목요일

[C++]C++에서의 continue 문과 활용법

C++에서의 continue 문과 활용법을 알아보세요. continue 문을 사용하여 반복문 내에서 특정 조건을 만족할 때 해당 반복을 건너뛸 수 있으며, 코드의 가독성과 효율성을 향상시킬 수 있습니다.


C++은 강력하고 널리 사용되는 프로그래밍 언어로, 많은 개발자들에게 인기를 얻고 있습니다. 이번 블로그에서는 C++에서의 continue 문에 대해 알아보고, 이를 활용하는 다양한 예제를 제시하겠습니다. continue 문을 이해하면 반복문 내에서 특정 조건을 만족할 경우 해당 반복을 건너뛸 수 있으며, 코드의 가독성과 효율성을 향상시킬 수 있습니다. 따라서 C++ 개발자라면 continue 문에 대한 이해와 활용법은 필수입니다.




continue 문의 기본 개념

continue 문은 반복문(for 루프, while 루프) 내에서 사용되며, 특정 조건을 만족할 경우 현재 반복을 건너뛰고 다음 반복을 실행합니다. 이를 통해 특정 조건에 따라 원하는 작업만을 수행할 수 있습니다. 아래는 continue 문의 기본 개념을 설명하는 예제 코드입니다.

1
2
3
4
5
6
for (int i = 1; i <= 10; i++) {
    if (i % 2 == 0) {
        continue;  // 짝수일 경우 현재 반복을 건너뛰고 다음 반복 실행
    }
    cout << i << " ";  // 홀수만 출력
}
cs




continue 문과 다중 반복문

continue 문은 다중 반복문에서 특히 유용하게 활용됩니다. 내부 반복문에서 특정 조건을 만족할 경우 외부 반복문으로 바로 건너뛸 수 있습니다. 아래는 continue 문과 다중 반복문을 함께 사용하는 예제 코드입니다.

1
2
3
4
5
6
7
8
for (int i = 1; i <= 5; i++) {
    for (int j = 1; j <= 5; j++) {
        if (i == j) {
            continue;  // i와 j가 같을 경우 현재 반복을 건너뛰고 다음 반복 실행
        }
        cout << "(" << i << ", " << j << ") ";  // i와 j가 다른 경우에만 출력
    }
}
cs




continue 문과 무한 루프

continue 문은 무한 루프를 제어하는 데에도 사용될 수 있습니다. 특정 조건을 만족할 경우 무한 루프 내의 코드 실행을 건너뛰고 다음 반복으로 이동합니다. 아래는 continue 문과 무한 루프를 함께 사용하는 예제 코드입니다.

1
2
3
4
5
6
7
8
9
10
11
12
int num;
while (true) {
    cout << "정수 입력 (0을 입력하면 종료): ";
    cin >> num;
    if (num == 0) {
        break;  // 0을 입력하면 무한 루프 종료
    }
    if (num % 2 == 0) {
        continue;  // 짝수일 경우 현재 반복을 건너뛰고 다음 반복 실행
    }
    cout << "홀수입니다." << endl;
}
cs




continue 문을 활용한 특정 조건 처리

continue 문을 사용하여 특정 조건에 따라 원하는 작업을 수행할 수 있습니다. 아래는 continue 문을 활용하여 홀수만을 처리하는 예제 코드입니다.

1
2
3
4
5
6
7
int numbers[] = {12345678910};
for (int i = 0; i < 10; i++) {
    if (numbers[i] % 2 == 0) {
        continue;  // 짝수일 경우 현재 반복을 건너뛰고 다음 반복 실행
    }
    cout << numbers[i] << " ";  // 홀수만 출력
}
cs




이번 블로그에서는 C++에서의 continue 문과 그 활용법에 대해 알아보았습니다. continue 문은 반복문 내에서 특정 조건을 만족할 경우 현재 반복을 건너뛰는 데에 사용되며, 코드의 가독성과 효율성을 높일 수 있습니다. continue 문을 적절히 활용하여 원하는 작업을 수행해보세요. C++ 개발에서 continue 문에 대한 이해는 보다 효율적이고 품질 높은 코드 작성을 도와줄 것입니다.

2023년 6월 25일 일요일

C++ 스택(Stack) Iterator: 간결하고 논리적인 데이터 접근

C++의 스택 iterator에 대한 깊은 이해를 위한 훌륭한 가이드입니다. 스택 iterator의 정의부터 구현 방법, 실제 사용 예시까지 살펴보며 C++에 대한 이해를 키워보세요.


안녕하세요, C++에 대한 이해를 더욱 풍부하게 하려는 개발자 여러분들, 오늘은 C++의 핵심 개념 중 하나인 '스택 Iterator'에 대해 알아보도록 하겠습니다. 이 글에서는 Iterator의 정의부터 사용 방법, 그리고 예제 코드를 통한 실제 적용까지 자세히 설명하겠습니다.


Iterator란?

C++에서 Iterator는 컨테이너 내의 요소에 순차적으로 접근할 수 있는 포인터와 유사한 개념입니다. 이를 통해 개발자는 컨테이너의 내부 구조를 알지 못해도 요소를 검색, 수정, 제거할 수 있습니다. 그중 '스택'은 LIFO(Last In First Out) 원칙을 따르는 컨테이너로, 가장 마지막에 들어온 요소가 가장 먼저 나가는 구조를 가집니다.


하지만 기본 C++ STL(Standard Template Library) 스택에서는 Iterator를 제공하지 않습니다. 왜냐하면, 이는 스택의 기본적인 원칙인 '가장 위쪽 요소만 접근 가능'을 해칠 수 있기 때문입니다. 그러나 종종 우리는 스택의 내부 요소에 접근할 필요성을 느낍니다. 이런 경우엔 어떻게 해야 할까요?


이 글에서는 STL 스택에서 제공하지 않는 스택 Iterator를 어떻게 구현할 수 있는지 알아보겠습니다. 우선, 스택에 Iterator를 추가하는 방법부터 알아봅시다.




스택 Iterator 구현하기

STL 스택은 사실 deque 또는 list와 같은 다른 컨테이너를 기반으로 작동합니다. 따라서, 스택의 내부 데이터에 접근하기 위해 이러한 기반 컨테이너의 Iterator를 사용할 수 있습니다.


다음은 이를 활용한 예시입니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// 스택을 기반으로 한 Iterator 예시
#include <iostream>
#include <stack>
#include <deque>
 
int main() {
    std::stack<int, std::deque<int>> s;
 
    // 스택에 데이터 추가
    for(int i=0; i<5++i) {
        s.push(i);
    }
 
    // Iterator 생성
    auto it = s.c.begin();
 
    // 스택 데이터 출력
    for(; it != s.c.end(); ++it) {
        std::cout << *it << ' ';
    }
 
    return 0;
}
cs

주의해야 할 점은 이 코드는 기본적인 스택의 정의를 해치는 접근 방식입니다. 따라서 이 방법은 상황에 따라 신중하게 사용해야 합니다.




std::vector를 활용한 스택 Iterator 구현

다음으로는 std::vector를 활용하여 스택과 같은 동작을 하는 컨테이너를 만들어보겠습니다. 이 방법을 통해 Iterator를 활용할 수 있습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// std::vector를 활용한 스택 Iterator 구현
#include <iostream>
#include <vector>
 
int main() {
    std::vector<int> stack;
 
    // 데이터 추가
    for(int i=0; i<5++i) {
        stack.push_back(i);
    }
 
    // Iterator 생성 및 데이터 출력
    for(auto it = stack.rbegin(); it != stack.rend(); ++it) {
        std::cout << *it << ' ';
    }
 
    return 0;
}
cs

이 방법을 사용하면 스택의 맨 위부터 요소에 접근할 수 있습니다. 이는 스택의 LIFO 원칙을 유지하면서도 Iterator를 통한 요소 접근을 가능하게 합니다.


이처럼 C++의 Iterator는 컨테이너의 요소에 효과적으로 접근할 수 있도록 도와주는 강력한 도구입니다. 스택을 사용하면서도 Iterator의 장점을 활용하고 싶다면, 이 글에서 제시한 방법들을 활용해보시기 바랍니다. 그리고 항상, 스택의 핵심 원칙을 기억하면서 코드를 작성하는 것이 중요합니다.


이상 C++ 스택 Iterator에 대한 내용이었습니다. 이 글이 여러분의 C++ 학습에 도움이 되었기를 바랍니다. 다음 글에서는 더 심도 있는 C++ 내용을 다루도록 하겠습니다. 끝까지 읽어주셔서 감사합니다.

Java Record: 간결하고 불변성을 가진 데이터 클래스를 만들기 위한 기능

Java 14부터 도입된 Record는 Java 프로그래밍에서 데이터 클래스를 간결하게 정의하고, 불변성을 가진 객체를 생성하는 데 도움을 주는 기능입니다. 이 블로그에서는 Java의 Record에 대해 소개하고, Record의 기능과 활용 방법에 대...