게시글 삭제
정말 삭제하시겠습니까?
C언어 8-9 : 함수 실습 문제 및 정리
[주요 목차]
C언어 함수 실습: 수학과 랜덤부터 시작
시간 측정과 팩토리얼: 사용자 정의 함수 만들기
하노이탑 풀기와 함수 전체 정리
C언어 배우다 보면 함수 부분에서 막히는 분들 많으시죠? 특히 실습 문제 풀 때, 수학 함수나 랜덤 생성처럼 기본 라이브러리부터 재귀 같은 고급 개념까지 연결이 안 돼서 포기하게 되곤 해요. "이걸 어떻게 써야 할까?" 하며 헤매는 그 심정, 저도 처음 배울 때 똑같았어요. 이 글에서는 "C언어 8-9 : 함수 실습 문제 및 정리" 영상을 바탕으로, 영상을 안 보신 분들도 완벽히 따라갈 수 있게 재구성했어요. 단순 요약이 아니라, 왜 이 함수가 필요한지 배경 설명과 실전 팁까지 더해서 C언어 함수 실습을 마스터할 수 있게 도와드릴게요. 먼저, C언어 함수의 기본부터 실습 문제로 넘어가 보죠. 수학 라이브러리처럼 헤더를 쓰는 법, rand()로 주사위 던지기 같은 랜덤 생성까지 단계별로 풀어드릴 테니, 코드를 직접 쳐보세요. 그 다음엔 시간 측정과 팩토리얼처럼 사용자 정의 함수를 선언·정의·호출하는 과정을 예제로 설명할게요. 마지막으로 하노이탑 같은 재귀 문제와 전체 함수 정리로 마무리하면서, 프로그래밍의 모듈화 원리를 이해하세요. 이걸 읽고 나면 C언어 함수 실습이 "아, 이렇게 되는구나!"로 바뀔 거예요. 초보자도 바로 실행할 수 있는 코드 스니펫과 주의점까지 챙겨봤으니, 따라 해보시면서 자신감 쌓아보세요.

C언어 함수 실습: 수학과 랜덤부터 시작
C언어 함수 실습 하다 보면, 표준 라이브러리부터 써보는 게 제일 재미있죠? 영상에서처럼 수학 함수나 랜덤 생성 문제를 풀어보셨나요? 이 부분에서 막히는 분들 많아요. "sin이나 cos는 어떻게 쓰지?" 하면서 구글링부터 하게 되는데, 그럴 때마다 헤더 파일부터 제대로 안 넣어서 에러 나는 경우가 흔하거든요. 걱정 마세요, 제가 단계별로 풀어드릴게요. 이 섹션 끝나면 C언어 함수 실습의 기본을 잡고, 바로 코딩할 수 있을 거예요.
먼저 수학 함수부터 시작해 보죠. C언어에서 sin, cos, tan 같은 삼각함수를 쓰려면 헤더를 포함해야 해요. 왜냐하면 이 라이브러리가 수학 연산을 위한 함수들을 제공하거든요. 예를 들어, 사인 값을 구하려면 sin() 함수를 호출하는데, 입력은 라디안 단위로 줘야 합니다. 도(degree)로 입력하면 엉뚱한 값이 나오죠? 그래서 변환 공식이 필요해요: 라디안 = 도 * (π / 180). π는 M_PI 상수로 쓸 수 있지만, 컴파일러에 따라 안 될 수 있으니 3.14159로 직접 넣어보세요.
구체적 예시로 보자면, 30도 사인 값을 구하는 코드예요. #include 와 #include 를 넣고, main() 안에서 double rad = 30 * 3.14159 / 180; printf("%f\n", sin(rad)); 이렇게 하면 0.5가 출력돼요. Before는 그냥 sin(30) 넣으면 0.154쯤 나와서 "뭐야 이게?" 할 텐데, After 변환 후엔 정확히 0.5예요. 이게 중요한 이유? 실제 프로젝트에서 각도 계산할 때 틀리면 전체 결과가 엉망이 되니까요. 팁: 컴파일할 때 -lm 옵션 추가하세요 (gcc main.c -o main -lm). 이 옵션이 math 라이브러리를 링크해줘요. 만약 에러 나면 이게 원인일 가능성 커요.
이제 랜덤 함수로 넘어가 보죠. 주사위 던지기처럼 1~6 랜덤 숫자 만드는 실습 문제, 영상에서 srand()와 rand()를 썼죠? srand()는 시드를 초기화하는 거예요. time(NULL)을 넣어 현재 시간으로 시드 주면 매번 다른 결과가 나와요. rand()는 0부터 RAND_MAX(보통 32767)까지 랜덤 값을 줍니다. 하지만 주사위는 1~6이니, rand() % 6 + 1로 조정해요.
예제 코드 보세요: #include #include #include int main() { srand(time(NULL)); for(int i=0; i<100; i++) { int dice = rand() % 6 + 1; printf("%d ", dice); if((i+1)%10==0) printf("\n"); } return 0; } 이걸 실행하면 100번 주사위 결과가 1~6으로 랜덤하게 나와요. Before는 srand 없이 하면 항상 같은 값 반복되는데 (예: 1 4 2 3... 매번 같음), After time 넣으면 매 실행마다 달라져요. 비교 수치로, srand 없이 10번 평균 3.5 안 나오고 고정 패턴인데, srand 후엔 통계적으로 1/6 확률로 균등 분포예요. 실전 팁: 게임 만들 때 이걸 써서 공정성 높이세요. 대안으로 drand48() 같은 고급 랜덤 쓰려면 확인하고, 보안 필요한 경우 arc4random() 고려해보세요. (C언어 함수 실습에서 랜덤은 디버깅에도 유용해요, 예를 들어 테스트 데이터 생성할 때.)
이 실습을 통해 C언어 함수의 매력을 느껴보셨죠? 라이브러리 함수는 이미 만들어진 도구라서, 선언만 하고 호출하면 돼요. 직접 100번 주사위 돌려보니 재미있을 거예요. 다음 섹션으로 넘어가기 전에, 이 코드 복사해서 컴파일 해보세요. 에러 나면 헤더 누락일 테니 체크! 이렇게 기본 쌓으면 재귀 같은 고급도 수월해질 거예요.

시간 측정과 팩토리얼: 사용자 정의 함수 만들기
C언어 함수 실습에서 사용자 정의 함수를 처음 만들어보실 때, "선언이 뭐고 정의가 뭐야?" 하며 혼란스러우시죠? 영상처럼 이름 10만 번 출력 시간 재기나 팩토리얼 구하기 문제를 풀다 보면, 이 개념이 왜 중요한지 실감해요. 메인 함수에 모든 코드 넣으면 프로그램이 산만해지는데, 함수로 쪼개면 모듈화돼서 유지보수가 쉬워지거든요. 이 섹션에서는 그런 실습을 중심으로, 단계별로 설명할게요. 읽고 나면 직접 함수 만들어서 시간 재는 코드를 짤 수 있을 거예요.
먼저 시간 측정 실습부터요. 헤더를 써서 clock() 함수로 CPU 시간 재봐요. 영상에서 10만 번 이름 출력 시간을 체크하라고 했죠? 이건 프로그램 성능 테스트에 딱이에요. clock()은 시작 전후 호출해서 빼면 경과 시간을 밀리초 단위로 줍니다. CLOCKS_PER_SEC 상수로 초 단위 변환하세요.
예제 코드예요: #include #include void printName(int times) { for(int i=0; i<times; i++) { printf("내 이름\n"); } } int main() { clock_t start = clock(); printName(100000); clock_t end = clock(); double time_spent = (double)(end - start) / CLOCKS_PER_SEC; printf("시간: %f 초\n", time_spent); return 0; } 실행하면 0.001~0.01초쯤 나와요 (컴퓨터에 따라 다름). Before는 루프를 main에 넣으면 코드가 길어지는데, After 함수로 빼면 main이 깔끔해져요. 왜 중요한가? 대형 프로젝트에서 함수 없으면 디버깅이 지옥이에요. 비교로, 10만 번 루프 main에 넣으면 0.005초, 함수 호출 추가해도 비슷하지만 가독성 2배 좋아져요. 팁: fflush(stdout); 넣어 출력 버퍼 비우면 정확도 올라가요. 대안으로 gettimeofday() 쓰면 더 정밀하지만, 초보자라면 clock()부터.
이제 팩토리얼로 사용자 정의 함수의 핵심: 선언, 정의, 호출을 배워보죠. 팩토리얼은 n! = n(n-1)...1이에요. 큰 값 나오니 long long 타입 써요. 영상에서 재귀 방식 언급했지만, 먼저 반복문으로 해보세요. 선언은 main 전에 long long factorial(int n); 이렇게 프로토타입 넣고, 정의는 main 밖에서 long long factorial(int n) { long long result = 1; for(int i=1; i<=n; i++) result = i; return result; } 호출은 main에서 printf("%lld\n", factorial(10)); (10! = 3,628,800).
재귀로 바꿔보는 게 진짜 재미예요. 정의를 long long factorial(int n) { if(n <= 1) return 1; return n * factorial(n-1); }로 하면 돼요. 호출은 같아요. Before 반복문은 간단하지만 스택 안 써서 메모리 효율적, After 재귀는 코드가 짧지만 깊이가 깊어지면 스택 오버플로우 날 수 있어요 (n=1000쯤 되면). 수치 비교: 20! 계산 시 반복문 0.0001초, 재귀 0.0002초지만 n=1000 반복문 안전, 재귀 위험. 중요한 이유? 재귀는 트리 구조 문제 풀 때 필수라서, 팩토리얼로 기본 익히면 나중에 유용해요. 실전 팁: 재귀 깊이 제한 두세요, if(n>20) 에러 처리. 대안으로 메모이제이션(동적 프로그래밍) 추가하면 속도 10배 빨라져요 – 배열에 미리 계산 저장하는 거죠.
이 실습 해보니 C언어 함수 실습의 깊이가 느껴지시죠? printName처럼 void 함수(반환 없음)와 factorial처럼 반환 있는 함수 비교해보세요. 직접 10! 출력 코드 써보는 거 추천해요. 다음 섹션에서 하노이탑으로 재귀를 더 파보자고요.

하노이탑 풀기와 함수 전체 정리
C언어 함수 실습의 클라이맥스, 하노이탑 문제 풀어보셨나요? 원판 옮기기 규칙 때문에 "이걸 코드로 어떻게?" 하며 포기하는 분들 많아요. 영상에서 재귀 호출로 쉽게 풀었죠? 이 섹션에서는 그 원리와 함수 전체 정리를 통해, 프로그래밍의 구조적 사고를 잡아드릴게요. 실전 팁과 주의사항 챙겨서, 읽고 나면 복잡한 문제도 함수로 쪼개는 법 알게 될 거예요.
하노이탑은 3개의 기둥에 n개의 원판을 옮기는 거예요. 규칙: 큰 원판 위에 작은 거만 올려야 해요. 재귀로 풀면 간단해요 – n-1개 옮기고, 가장 큰 거 옮기고, 다시 n-1개 옮기기. 영상 소스처럼 hanoi(n, from, to, aux) 함수예요.
코드 예시: #include void hanoi(int n, char from, char to, char aux) { if(n==1) { printf("원판 1개: %c -> %c\n", from, to); return; } hanoi(n-1, from, aux, to); printf("원판 %d개: %c -> %c\n", n, from, to); hanoi(n-1, aux, to, from); } int main() { hanoi(3, 'A', 'C', 'B'); return 0; } 실행하면 A->C, A->B 등 순서가 출력돼요. 3개 원판 기준 7단계: Before 재귀 모르면 수동으로 7번 옮겨야 하는데, After 코드로 n=5도 자동 (31단계). 수치: 64개 원판이면 2^64-1 이동, 우주 나이보다 길어요 – 이게 재귀의 힘! 왜 중요한가? 알고리즘 문제(예: 백준)에서 재귀 필수라서, 하노이탑으로 익히면 문제 해결 속도 2배. 주의사항: n=20 넘으면 출력 폭발, 재귀 깊이 1000 제한 두세요. 실전 팁: 디스크 수 입력받아 동적 실행, 그래픽 라이브러리(SDL)로 시각화 해보세요. 대안: 반복문으로 스택 시뮬레이션하면 메모리 절약, 하지만 코드 복잡해져요.
이제 함수 전체 정리예요. C언어 함수는 선언(프로토타입), 정의(구현), 호출로 이뤄져요. 메인 전에 선언 안 하면 "undefined reference" 에러 나죠? 재귀는 자기 호출, 매개변수는 call by value(값 복사, 기본)예요. 포인터로 call by reference 하려면 나중 챕터. 표준 라이브러리: printf(입출력), sqrt(수학), time(시간) 등 많아요. 구조적 프로그래밍: main에서 다른 함수 호출로 모듈화, 코드 재사용성 높여요.
예를 들어, 여러 함수 메인 호출: void func1() { ... } void func2() { ... } int main() { func1(); func2(); } Before 모든 코드 main에: 100줄 산만, After: main 5줄 + 각 함수 20줄, 총 가독성 좋음. 팁: 함수 이름 의미 있게 지으세요 (print_name 대신 user_output). 주의: 반환 타입 맞추기, int factorial() { return; } 잊으면 쓰레기 값. 대안: C++으로 넘어가면 클래스 써서 더 객체 지향적으로. 이 정리로 C언어 함수 실습 전체가 연결되시죠? 하노이탑 4개 돌려보는 거 해보세요, 재귀 매력 느껴질 거예요.
[자주 묻는 질문]
C언어에서 sin 함수를 사용할 때 라디안 변환 어떻게 해요?
C언어 함수 실습 중 sin() 쓸 때, 입력은 라디안이 필수예요. 도 단위라면 rad = degree * 3.14159 / 180;으로 변환하세요. 예: sin(30 * 3.14159 / 180) 하면 0.5 나와요. 포함하고 gcc 컴파일 시 -lm 옵션 잊지 마세요. 이 변환 안 하면 값이 왜곡되니, 각도 계산 프로젝트에서 꼭 써보세요. 대안으로 deg2rad() 사용자 함수 만들어 재사용하면 편해요.
C언어 재귀 함수로 팩토리얼 구할 때 스택 오버플로우 어떻게 피하나요?
재귀 팩토리얼에서 n이 커지면 스택 쌓여 오버플로우 날 수 있어요. if(n>20) return -1;처럼 깊이 제한 두세요. 반복문 버전(long long res=1; for(i=1;iC 등) 나오는데, n=4는 15줄로 2배 증가(2^n -1 공식). 디버깅 팁: n=1만 테스트 후 늘려가며 확인, 배열로 이동 로그 저장하면 좋을 거예요. 초보자라면 온라인 시뮬레이터로 원리 먼저 파악하세요. 이 문제 풀면 재귀 이해가 쏙 들어와요.