이번에도 간단한 문제를 풀고 그 과정을 일반화 하여 함수로 제작해 보도록 하겠습니다
--------------------------------------------------------------------------------------------------------------------------------
다음 중 연속된 세 자연수의 합이 될 수 없는 것은?(2.5점)
1.33
2.37
3.42
4.48
5.57
- 출처: 한국정보올림피아드 기출 -
문제를 보면, 차례대로 연속되는 세 개의 자연수를 합해서 나올 수 있는 결과가 아닌 것을 찾는 것이다
우선 자연수를 간단히 정의하면, 1부터 시작하는 양의 정수를 일컫는다
즉 1,2,3,4,5,....
그리고 연속된 자연수를 공식화 해 보면 아래와 같다
(a - 1) , a , (a + 1) , a는 자연수
즉 주어진 값 x가 연속된 자연수이기 위해서는
(a - 1) + a + (a + 1) = x 가 되어 3a = x 가 성립해야 한다
그리고 a가 자연수 이어야 하기 때문에 a = x / 3 일 때 x는 3으로 나누어 떨어져야 a는 자연수임이 보장된다
이 때 a 는 연속되는 세 자연수의 중간 수가 된다
결과적으로 주어진 결과값이 3으로 나누어 떨어져야만 그 수는 연속되는 세 자연수의 합이 되는 것이다
이제 이 알고리즘을 함수로 만들어 보자
함수 설명: 주어진 수가 연속되는 세 자연수의 합인지 판별하고 그럴 경우 세 자연수를 반환한다
입력 매개변수: 세 자연수의 합을 판별할 값
출력 매개변수: 세 수의 합의 결과가 입력 값이 되기 위한 연속되는 세 자연수(배열 이용)
함수 정의>>
static int[] ThreeNaturalNumbers(int number)
{
int rest = number % 3; //주어진 수를 3으로 나눈 나머지
if (number > 3 & rest == 0) //나머지가 0인 경우, 즉 3으로 나누어 떨어질 경우
{
int a = number / 3; //3으로 나눈 값, 연속되는 세 자연 수의 중간 수가 된다
return new int[] { a - 1, a, a + 1 }; //중간 수를 기준으로 앞,뒤로 +- 1 하여 반환
}
else
{
return null; //3으로 나누어 떨어지지 않으면 연속된 세 자연수의 합이 아님
}
}
3으로 나눈 나머지를 알기 위해 number % 3 식을 사용했으며
조건식에서 나머지 값(rest)가 0이 되는 경우 즉 3으로 나누어 떨어지는 경우를 체크하고 있다
그리고 number > 3 을 체크한 이유는, number이 3인 경우 비록 3으로 나누어 떨어지지만
그 연속된 세 가지 수는 (0,1,2) 가 되어 0이 포함하기 때문에 제외시킨 것이다(0은 자연수가 아님)
함수 호출>>
static void Main(string[] args)
{
int[] result = ThreeNaturalNumbers(33);
if (result != null)
{
for (int i = 0; i < result.Length; i++)
{
Console.WriteLine(result[i]);
}
}
else
{
Console.WriteLine("연속된 세 자연수의 합이 아님");
}
}