본문 바로가기

c언어코드업23

[C/C++] 코드업 1916 : (재귀함수) 피보나치 수열 (Large) 문제풀이 이 문제는 메모이제이션을 이용하여 재귀 함수 계산 시간을 단축하는 문제임. 이전 문제에서는 단순히 함수 호출을 반복해서 하였으나, 이번 문제는 배열에 결과값을 적고, 값이 필요하면 '함수를 호출하는 것'이 아니라 '배열에서 이전에 계산한 값'만 불러오게 되어 시간이 단축되는 구조임. 중복해서 함수를 계속 부르는 것보다 배열에서 가져다 쓰는 게 빠름. 메모이제이션은 top down과 bottom up이 있는 데, 사실 이러한 개념보다는 아래 문장을 외워보는 게 좋음. '값이 배열에 적혀 있지 않으면 배열에 적은 후 리턴하고, 값이 이미 적혀 있다면 적힌 값을 리턴함.' 이것만 잊지 않는다면 웬만한 메모이제이션 문제를 모두 풀 수 있음. 그리고 잘 보면 아래에 %10009로 나머지 구하는 걸 거의 .. 2022. 10. 8.
[C/C++] 코드업 1915 : (재귀함수) 피보나치 수열 문제풀이 재귀함수를 사용하여 피보나치 수열을 구하면 됨. 이전 두 항의 합을 더하면 현재 항의 값이 나오게 됨. 재귀 함수 관점에서 생각하면 5번째 항이면 3번째와 4번째 항, 그리고 각각 3번째 항은 (1번째 항과 2번째 항)의 합이고, 4번째 항은 (2번째 항과 3번째 항)의 합이 됨. 이런 식으로 쪼개지고 쪼개지고 하는 것임. 이번 문제는 시간 제한이 2초나 되고 입력되는 자연수가 20이하이므로 재귀 함수를 편하게 구현하면 됨. 소스코드 #include using namespace std; int fibbo(int a){ if (a==1 || a==2) return 1; else return fibbo(a-1)+fibbo(a-2); } int main() { int n; cin>>n; cout 2022. 10. 8.
C언어 코드업 1023번 1023 : [기초-입출력] 실수 1개 입력받아 부분별로 출력하기(설명) 문제 실수 1개를 입력받아 정수 부분과 실수 부분으로 나누어 출력한다. 문제풀이 #include #pragma warning(disable:4996) int main() { int x,y; scanf("%d.%d", &x,&y); printf("%d\n", x); printf("%d", y); return 0; } - 문제에서 특별히 소수점 아래 자리는 0이 입력되지 않는다고 하였으므로 입력되는 숫자 예를 들어 1234.5676를 정수부와 소수점 아래 부분으로 나누어 입력 받는다. - 이를 printf 함수로 나누어 출력한다. 2022. 2. 8.
C언어 코드업 1022번 1022 : [기초-입출력] 문장 1개 입력받아 그대로 출력하기(설명) 문제 공백 문자가 포함되어 있는 문장을 입력받고 그대로 출력하는 연습을 해보자. 문제풀이 #include #pragma warning(disable:4996) int main() { char x[2001]; fgets(x,sizeof(x),stdin); printf("%s", x); } - 문제 입력에 최대 2000글자가 입력된다고 하므로 x[2001]로 문자열을 지정한다. - scanf 함수를 쓰지 않고 fgets(file-get-string) 함수를 사용하였다. 둘의 차이를 간단히 비교하면, scanf는 int, float, char, double 등 여러 종류의 데이터형을 입력받을 수 있으나 문자열에서는 약한데, 이유는 공백이 생기면 더 이상 입력을 받지 않기 때문이다. 반면에 fgets는 int,.. 2022. 2. 8.