일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 백준
- 컴공과
- cs
- 너비우선탐색
- Stack
- 코테
- 오에스
- 스택
- 개발
- c++
- 컴공
- 자료구조
- coding
- 오퍼레이팅시스템
- 컴퓨터공학과
- bfs
- 코딩
- 구현
- OS
- 정석
- Operating System
- 북리뷰
- 브루트포스
- 알고리즘
- vector
- 문제풀이
- 그래프
- Computer science
- DP
- 정석학술정보관
- Today
- Total
목록재귀 (4)
Little Jay
피보나치를 이용한 재귀 문제였다. Zeckendorf's theorem을 사용하는 문제였는데, 이분의 블로그를 보면 쉽게 이해가 가능하다. 결과적으로 피보나치 수가 n 보다 클 때 직전항을 빼주면서 재귀적으로 내려가면 된다. #include using namespace std; long long fibo[10000001]; void solve(int n) { if (n == 0) return; for (int i = 0; i n; solve(n); cout
아래의 문제 15650번과 유사한 문제이다 #include #include #define MAX 9 using namespace std; int n, m; int arr[MAX] = { 0, }; bool visited[MAX] = { 0, }; void dfs(int num, int cnt) { if (cnt == m) { for (int i = 0; i < m; i++) cout m; dfs(1, 0); return 0; }
이번에는 중복순열 문제이다 이전에는 중복을 체크하면서 DFS를 했는데, 이번에는 중복을 허용하기때문에 그 부분만 주석처리 해주어 쉽게 풀 수 있었다. #include #include #define MAX 9 using namespace std; int n, m; int arr[MAX] = { 0, }; bool visited[MAX] = { 0, }; void dfs(int cnt) { if (cnt == m) { for (int i = 0; i < m; i++) cout m; dfs(0); return 0; }
문제파악을 잘 해야하는 문제이다. 일반적인 GCD 알고리즘을 사용하면 되는데, 최대 공약수만큼 1을 출력해주면 된다. #include using namespace std; long long GCD(long long a, long long b) { if (a % b == 0) return b; return GCD(b, a%b); } int main() { ios_base::sync_with_stdio(false); cin.tie(0); long long a, b; cin >> a >> b; long long result = GCD(a, b); for (int i = 0; i < result; i++) cout