반응형
알고리즘은 너무 어렵다.
처음에 종만북( 알고리즘 문제해결 전략 1,2) 으로 공부를 시작했지만, 처음부터 나오는 재귀함수와 그리고 이해의 어려움때문에 책읽는 내내 진도가 나가질 않았다. 코드를 붙잡고 시간을 투자하면 이해는 되긴 하지만, 조금 더 설명을 해주면 코드 이해하기가 더 수월했을 부분도 적지 않다. 즉 내 수준보다 더 높은 이해력과 사고력을 요구 했다. 그때 좌절을 준 완전탐색 재귀함수는 인강의 도움을 받아도 이해하기 어려웠다. 지금은 잠시 보류해 두었지만 알고리즘 입문때 재귀함수를 이해하려고 노력했던 내 자신이 대견스럽다.
재귀함수 종류:
- 브루트 포스
- DFS
- Dp
지금은 위와 같이 조금이라도 큰 그림을 그리며 재귀함수 구조라도 다른 특성을 가짐을 이해하며 보니 훨씬 코드가 수월하게 읽힌다.
아래 코드 둘다 재귀함수를 이용한다.
#include <iostream>
using namespace std;
bool c[10];
int a[10];
void go(int index, int n, int m) {
if (index == m) {
for (int i=0; i<m; i++) {
cout << a[i];
if (i != m-1) cout << ' ';
}
cout << '\n';
return;
}
for (int i=1; i<=n; i++) {
if (c[i]) continue;
c[i] = true;
a[index] = i;
go(index+1, n, m);
c[i] = false;
}
}
int main() {
int n, m;
cin >> n >> m;
go(0,n,m);
return 0;
}
//15650
#include <iostream>
using namespace std;
bool c[10];
int a[10];
void go(int index, int start, int n, int m) {
if (index == m) {
for (int i=0; i<m; i++) {
cout << a[i];
if (i != m-1) cout << ' ';
}
cout << '\n';
return;
}
for (int i=start; i<=n; i++) {
if (c[i]) continue;
c[i] = true;
a[index] = i;
go(index+1, i+1, n, m);
c[i] = false;
}
}
int main() {
int n, m;
cin >> n >> m;
go(0,1,n,m);
return 0;
}
#include <iostream>
#include <cstring>
using namespace std;
long long d[31][31];
long long calc(int f, int h) {
if (d[f][h] != -1) return d[f][h];
if (f == 0) return 1;
if (h == 0) return d[f][h] = calc(f-1, h+1);
return d[f][h] = calc(f-1,h+1) + calc(f,h-1);
}
int main() {
memset(d,-1,sizeof(d));
while (true) {
int n;
cin >> n;
if (n == 0) break;
cout << calc(n, 0) << '\n';
}
return 0;
}
나는 종만북을 미뤄두고 백준선생님의 코드플러스 인강을 듣기 시작했다. 진작에 들을껄..
code.plus
코드 플러스는 코딩강의를 합니다
code.plus
갑자기 진절머리가 나서 쓰는 글이다.
%연산자를 &쓰고 15분동안 찾고 멘붕이 옴.
반응형
'끄적임' 카테고리의 다른 글
태국 여행 전에 알아 두어야 할 62 가지 사항 (0) | 2019.05.14 |
---|---|
루시드 드림(자각몽)에 대한 신비로운 사실 (0) | 2019.03.24 |
어도비 스파크 그래픽 에디팅 (0) | 2019.02.09 |