함수 심화 문제 3종을 한 번에 풀어보도록 하자
1. 복합 조건을 가진 함수 제작
2. 자릿수 합 디코더 제작
3. 피보나치 함수 제작
크게 어려운 문제는 아니니 바로 시작해보자
심화 과제 1 - 복합조건을 가진 함수 제작
- 인자값으로 정수형 하나가 주어지면, 숫자 1에서부터 인자값으로 전달받은 숫자 사이의 모든 자연수 중, 3의 배수이거나 5의 배수인 수들의 합을 구하여 정수형으로 반환하는 함수를 작성하세요
바로 코드 작성 순서가 보인다.
1. 정수 변수 선언
2. 입력 받을 Console.ReadLine()과 정수형 변환을 위한 TryParse 사용
3. 1부터 입력받은 정수까지 순회하며 3의 배수, 혹은 5의 배수에 해당하는 숫자를 모두 더한 뒤 반환하는 함수 제작
4. 함수로 반환된 값 콘솔 출력
지금까지 사용했던 기능들로 간단하게 구현할 수 있을 것 같다.
using System;
namespace CsharpStudy
{
internal class Program
{
static void Main()
{
// 정수형 입력
int a;
Console.WriteLine("계산할 정수를 입력하세요");
Console.WriteLine("1부터 입력한 수 사이에 있는 모든 3의 배수와 5의 배수의 합을 구합니다");
while (true)
{
if (int.TryParse(Console.ReadLine(), out a))
{
if (a < 0) Console.WriteLine("양수만 넣어요 자연수 구하는 거잖아요");
else break;
}
else Console.WriteLine("정수만 넣어요");
}
// 함수 실행 후 콘솔 출력
int answer = Calc(a);
Console.WriteLine(answer);
}
static int Calc(int a)
{
// 숫자 1에서부터 인자값으로 전달받은 숫자 사이의 모든 자연수 중,
// 3의 배수이거나 5의 배수인 수들의 합을 구하여 정수형으로 반환하는 함수를 작성하세요
int result = 0;
for (int i = 1; i <= a; i++)
{
if (i % 3 == 0 || i % 5 == 0)
{
result += i;
}
}
return result;
}
}
}

5분 컷
3 + 5 + 6 + 9 + 10 + 12 + 15 + 18 + 20 = 98 맞다
다른 수도 계산기를 통해 검산해봤는데 제대로 출력하는 게 확인된다.
쉽게 금방 끝냈으니 바로 다음 문제로 넘어가자.
심화 과제 2 - 자릿수 합 디코더 제작
- 인자값으로 1이상의 수를 입력받았을 때, 주어진 정수의 각 자리 수를 더한 결과를 정수형으로 반환하는 함수를 작성하세요. 예를 들어, 5611은 5+6+1+1 로 13을 반환하는 함수입니다.
일단 정수 입력 받는 부분까지는 동일하니 Calc 함수만 수정해보도록 하자.
우선 각 자리수를 추출하는 방법은 여러가지 있을 수 있다.
문자열로 형변환해서 각 자리 문자를 분해한 뒤, 다시 숫자형으로 변환하는 방법이 있지만
형변환을 하지 않고 구현해보았다.
이 편이 성능상으로도 효율적이다.
의외로 매우 간단하다
% 연산자를 쓰면 나머지를 반환한다
즉 n%10 을 하면 1의 자리 수만 반환된다.
그렇게 입력받은 수 a를 %10 을 하여 1의 자리 수를 일단 result에 넣어준 뒤
반복문을 통해 a / 10 후 그 수를 다시 %10 하여 이전 10의자리 수였던 부분을 추출해낸 뒤 result에 더해준다
이 과정을 반복하면 모든 자릿수를 더한 result가 완성된다.
아래 코드를 통해 바로 구현해보았다.
using System;
namespace CsharpStudy
{
internal class Program
{
static void Main()
{
// 정수형 입력
int a;
Console.WriteLine("계산할 정수를 입력하세요");
while (true)
{
if (int.TryParse(Console.ReadLine(), out a))
{
if (a < 0) Console.WriteLine("양수만 넣어요 자연수 구하는 거잖아요");
else break;
}
else Console.WriteLine("정수만 넣어요");
}
// 함수 실행 후 콘솔 출력
int answer = Calc(a);
Console.WriteLine(answer);
}
static int Calc(int a)
{
int result = a % 10;
while (a > 10)
{
int b = a / 10;
result += b % 10;
a = b;
}
return result;
}
}
}

잘 작동한다.
이번에는 입력 단이 이미 구현돼있었기 때문인지 거의 2분만에 구현한 것 같다.
바로 다음 문제로 넘어가 보자
심화 과제 3. 피보나치 함수 제작
- 피보나치 수란, 맨 첫째와 둘째 항은 각각 1이지만, 그 뒤로 오는 모든 항은 앞의 두 항의 합인 수열입니다. 예를 들어 [1,1,2,3,5,8,...] 이렇게 4번째(3) 항목은 2번째(1)와 3번째(2)의 합이고, 마찬가지로 6번째(8) 항목은 바로 앞 4번째(3), 5번째(5)의 합인 형태입니다. 함수의 인자값으로 '몇번째' 인지 정수로 건네주면, 일치하는 피보나치 수를 반환하는 함수를 제작하세요. 참고로 11번째 피보나치 수는 89, 20번째 피보나치 수는 6765 입니다.
이번에는 조금 어려워 보이는 문제다.
우선 피보나치의 규칙을 이해해야한다
설명과 숫자들을 살펴보면 X(n+2) = X(n) + X(n+1) 의 규칙을 갖고있다.
실제 대입해보면
1 + 1 = 2 니까
1, 1, 2
1 + 2 = 3 이니까
1, 1, 2, 3
2 + 3 = 5 니까
1, 1, 2, 3, 5
그 다음은 8, 13, 21. . . . 이렇게 진행 될 것이다.
피보나치의 첫 번째 수가 1이니 이것을 x라고 정의해서 x = 1 로 정의하자
그럼 두 번째 수가 1이 되려면 피보나치의 0번째 수는 0이 되어야 한다
x = 1, y = 0 으로
시작해서 반복문을 통해 입력한 수 미만까지 반복한다.
i = 1, i < a; 로 초기식과 조건식을 정한 이유는
피보나치 수로 처음 구하는 건 숫자열(0) 이 아니라
숫자열(1) 에 해당하는 1이기 때문이다
즉 목표 자릿수보다 1개 적어야 한다.
즉 x + y 를 통해 원하는 자릿수 result를 우선 구한다
그 후, 다음에 계산될 y에는 x를, x에는 현재 구한 result를 대입해서 다음 연산을 대비한다.
이 과정을 반복시키는 함수를 만들어 적용해보자.
using System;
namespace CsharpStudy
{
internal class Program
{
static void Main()
{
// 정수형 입력
int a;
Console.WriteLine("정수를 입력하세요");
Console.WriteLine("입력한 정수에 해당하는 피보나치 수를 반환합니다");
while (true)
{
if (int.TryParse(Console.ReadLine(), out a))
{
if (a < 0) Console.WriteLine("양수만 넣어요");
else break;
}
else Console.WriteLine("정수만 넣어요");
}
// 함수 실행 후 콘솔 출력
int answer = Calc(a);
Console.WriteLine(answer);
}
static int Calc(int a)
{
int result;
int x = 1;
int y = 0;
for (int i = 1; i < a; i++)
{
result = x + y;
y = x;
x = result;
}
return result;
}
}
}


정확히 출력되는 게 보인다.
배열을 통해 실제로 피보나치 수 전체를 구하는 방식으로 구현한 사람도 봤는데 복잡한 문제일 수록 다양한 접근법이 있는 것 같다.
'C#' 카테고리의 다른 글
| C# - 재귀함수 (Recursive Function) (0) | 2025.09.11 |
|---|---|
| C# - Main (0) | 2025.09.11 |
| C# - 배열 심화 문제 - 스킬 쿨타임 갱신 (0) | 2025.09.11 |
| C# - 배열 심화 문제 - 인벤토리 크기 지정하기 (0) | 2025.09.11 |
| C# - 배열 심화 문제 - 2차원 배열 swap (0) | 2025.09.11 |