성적 등급 변환 함수
정수형 점수를 입력받아 등급 문자를 반환하는 함수를 구현합니다. 10점 단위로 구간을 나누어 A부터 E까지의 등급을 부여합니다.
#include <stdio.h>
char calculate_grade(int mark);
int main() {
int mark;
char level;
while (scanf("%d", &mark) != EOF) {
level = calculate_grade(mark);
printf("점수: %d, 등급: %c\n\n", mark, level);
}
return 0;
}
char calculate_grade(int mark) {
char result;
switch (mark / 10) {
case 10:
case 9: result = 'A'; break;
case 8: result = 'B'; break;
case 7: result = 'C'; break;
case 6: result = 'D'; break;
default: result = 'E';
}
return result;
}주요 확인사항: 문자 상수는 반드시 작은따옴표(')를 사용해야 하며, 각 case 문 뒤에 break를 빠뜨리면 의도치 않은 fall-through가 발생합니다.
자릿수 합계 계산
반복문을 활용하여 정수의 각 자릿수를 분리하고 합산하는 함수입니다. 재귀적 접근법으로도 동일한 결과를 얻을 수 있습니다.
#include <stdio.h>
int digit_sum(int num);
int main() {
int num, total;
while (printf("숫자 입력: "), scanf("%d", &num) != EOF) {
total = digit_sum(num);
printf("n = %d, 합계 = %d\n\n", num, total);
}
return 0;
}
int digit_sum(int num) {
int total = 0;
while (num != 0) {
total += num % 10;
num /= 10;
}
return total;
}른 거듭제곱 알고리즘
분할 정복 기법을 적용한 거듭제곱 계산 함수입니다. 지수가 짝수일 때 절반으로 나누어 계산한 뒤 제곱하면 시간 복잡도를 O(log n)으로 개선할 수 있습니다.
#include <stdio.h>
int fast_pow(int base, int exp);
int main() {
int base, exp, result;
while (printf("밑과 지수 입력: "), scanf("%d%d", &base, &exp) != EOF) {
result = fast_pow(base, exp);
printf("%d^%d = %d\n\n", base, exp, result);
}
return 0;
}
int fast_pow(int base, int exp) {
int half;
if (exp == 0)
return 1;
else if (exp % 2 == 1)
return base * fast_pow(base, exp - 1);
else {
half = fast_pow(base, exp / 2);
return half * half;
}
}삼각형 분류 함수
세 변의 길이를 입력받아 삼각형의 종류를 판별합니다. 삼각형 불등식을 먼저 검증한 후, 등변, 직각, 정삼각형 여부를 순차적으로 확인합니다.
#include <stdio.h>
int triangle_type(int x, int y, int z);
int main() {
int x, y, z, kind;
while (scanf("%d%d%d", &x, &y, &z) != EOF) {
kind = triangle_type(x, y, z);
switch (kind) {
case 0: printf("삼각형 아님\n"); break;
case 1: printf("일반 삼각형\n"); break;
case 2: printf("정삼각형\n"); break;
case 3: printf("이등변삼각형\n"); break;
case 4: printf("직각삼각형\n"); break;
}
}
return 0;
}
int triangle_type(int x, int y, int z) {
if (x + y <= z || x + z <= y || y + z <= x)
return 0;
if (x == y && y == z)
return 2;
if (x == y || x == z || y == z)
return 3;
if (x*x + y*y == z*z || x*x + z*z == y*y || y*y + z*z == x*x)
return 4;
return 1;
}조합 계산: 반복 vs 재귀
이항 계수 nCm을 계산하는 두 가지 방식을 비교합니다. 반복문 방식은 메모이제이션 효과를 활용하고, 재귀 방식은 파스칼의 항등식 C(n,m) = C(n-1,m) + C(n-1,m-1)을 직접 구현합니다.
// 반복적 접근법
#include <stdio.h>
int comb_iter(int n, int r);
int main() {
int n, r, val;
while (scanf("%d%d", &n, &r) != EOF) {
val = comb_iter(n, r);
printf("C(%d,%d) = %d\n\n", n, r, val);
}
return 0;
}
int comb_iter(int n, int r) {
if (r > n) return 0;
if (r == 0 || r == n) return 1;
if (r > n - r) r = n - r;
int res = 1;
for (int i = 1; i <= r; i++) {
res = res * (n - r + i) / i;
}
return res;
}// 재귀적 접근법
#include <stdio.h>
int comb_recur(int n, int r);
int main() {
int n, r, val;
while (scanf("%d%d", &n, &r) != EOF) {
val = comb_recur(n, r);
printf("C(%d,%d) = %d\n\n", n, r, val);
}
return 0;
}
int comb_recur(int n, int r) {
if (r > n) return 0;
if (r == 0 || r == n) return 1;
return comb_recur(n - 1, r) + comb_recur(n - 1, r - 1);
}세 수의 최대공약수
세 정수의 공통 약수 중 가장 큰 값을 찾는 함수입니다. 세 수의 최솟값부터 1까지 역순으로 검색하여 처음 발견하는 공약수를 반환합니다.
#include <stdio.h>
int find_gcd_triple(int p, int q, int r);
int main() {
int p, q, r, common;
while (scanf("%d%d%d", &p, &q, &r) != EOF) {
common = find_gcd_triple(p, q, r);
printf("최대공약수: %d\n\n", common);
}
return 0;
}
int find_gcd_triple(int p, int q, int r) {
int smallest = p;
if (q < smallest) smallest = q;
if (r < smallest) smallest = r;
for (int d = smallest; d >= 1; d--) {
if (p % d == 0 && q % d == 0 && r % d == 0)
return d;
}
return 1;
}패턴 출력: 캐릭터 라인
중첩 반복문과 보조 함수를 활용해 감소하는 패턴의 캐릭터 라인을 출력합니다. 각 행마다 머리, 몸통, 다리를 구성하고 들여쓰기로 삼각형 형태를 만듭니다.
#include <stdio.h>
#include <stdlib.h>
void draw_scene(int cnt);
void draw_head(void);
void draw_torso(void);
void draw_legs(void);
int main() {
int cnt;
printf("줄 수 입력: ");
scanf("%d", &cnt);
draw_scene(cnt);
return 0;
}
void draw_head(void) { printf(" O\t"); }
void draw_torso(void) { printf("<H>\t"); }
void draw_legs(void) { printf("I I\t"); }
void draw_scene(int cnt) {
int row, space, fig;
for (row = 0; row < cnt; row++) {
int figures = 2 * cnt - 2 * row - 1;
for (space = 0; space < row; space++) printf("\t");
for (fig = 0; fig < figures; fig++) draw_head();
for (space = 0; space < row; space++) printf("\t");
printf("\n");
for (space = 0; space < row; space++) printf("\t");
for (fig = 0; fig < figures; fig++) draw_torso();
for (space = 0; space < row; space++) printf("\t");
printf("\n");
for (space = 0; space < row; space++) printf("\t");
for (fig = 0; fig < figures; fig++) draw_legs();
for (space = 0; space < row; space++) printf("\t");
printf("\n");
}
}