Creative Commons License

Software Dev

프로그래밍기본
객체지향
프로젝트관리
알고리즘
데이타베이스

소프트웨어 개발에 필수적이고 필요한 주제에 대한 강의 및 공유

.

알고리즘

주어진 문제를 효과적으로 해결하기 위한 문제해결논리에 대해 다룹니다

[문제] 연속된 세 자연수 구하기

작성자 : 박종명
최초 작성일 : 2010-03-22 (월요일)
최종 수정일 : 2010-03-22 (월요일)
조회 수 : 8218

이번에도 간단한 문제를 풀고 그 과정을 일반화 하여 함수로 제작해 보도록 하겠습니다

--------------------------------------------------------------------------------------------------------------------------------

다음 중 연속된 세 자연수의 합이 될 수 없는 것은?(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("연속된 세 자연수의 합이 아님");
       }
}

이름
비밀번호
홈페이지
IO <- 왼쪽의 문자를 오른쪽 박스에 똑같이 입력해 주세요