ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • JUNGOL 기초다지기 13 함수3
    보관함 2019. 12. 16. 20:35

    프로그래밍에서 가장 기초적인 내용을 다루는 기초 다지기입니다.

    이번 포스팅은 기초 다지기 중 열세 번째인 함수3 문제를 풀어보도록 하겠습니다.

     

    기초 내용인 만큼 다른 설명없이 문제와 코드만 간단하게 작성하도록 하겠습니다.


    587 : 함수3 - 자가진단1

     

    함수3의 문제는 재귀 함수를 위주로 작성되어 있습니다. 재귀 함수는 함수 스스로가 스스로를 출력하는 함수이며 특정 상황을 잘 표현할 수 있으나 많은 경우 반복문을 통해 더 효율적인 코드를 구현할 수 있습니다.

    #include <iostream>
    
    using namespace std;
    
    void RecursiveFunc(int n);
    
    int main(void)
    {
    	int n;
    
    	cin >> n;
    
    	RecursiveFunc(n);
    }
    
    void RecursiveFunc(int n)
    {
    	if (n <= 0)
    		return;
    
    	cout << "recursive" << endl;
    
    	RecursiveFunc(n - 1);
    }

     

    588 : 함수3 - 자가진단2

    #include <iostream>
    
    using namespace std;
    
    void RecursiveFunc(int n);
    
    int main(void)
    {
    	int n;
    
    	cin >> n;
    
    	RecursiveFunc(n);
    }
    
    void RecursiveFunc(int n)
    {
    	if (n <= 0)
    	{
    		cout << endl;
    		return;
    	}
    
    	cout << n << ' ';
    
    	RecursiveFunc(n - 1);
    }

     

    589 : 함수3 - 자가진단3

     

    이런 문제가 대표적인 반복문으로 더 효율적인 코딩이 가능한 문제입니다.

    사실 더 효율적인 방법인 공식을 사용하는 것입니다.

    #include <iostream>
    
    using namespace std;
    
    int RecursiveFunc(int n);
    
    int main(void)
    {
    	int n;
    
    	cin >> n;
    
    	cout << RecursiveFunc(n) << endl;
    }
    
    int RecursiveFunc(int n)
    {
    	if (n <= 0)
    	{
    		return 0;
    	}
    
    	return n + RecursiveFunc(n - 1);
    }

     

    590 : 함수3 - 자가진단4

     

    개인적으로 이런 유형의 문제에 약해서 시간이 좀 걸렸습니다.

     

    문제의 힌트를 드리자면 기본적으로 이전의 값을 지속적으로 출력해 줘야 하기 때문에 배열이 필요합니다.

    그리고 중복이 안되게 하는 것은 간단하게 현재 들어갈 위치의 바로 직전의 값부터 값을 시작하면 값이 겹치지 않게 되므로 중복을 제거할 수 있습니다.

    #include <iostream>
    
    using namespace std;
    
    void RecursiveFunc(int arr[], int n, int cur);
    
    int main(void)
    {
    	int n;
    
    	cin >> n;
    
    	int* arr = new int[n];
    
    	for (int i = 1; i <= 6; ++i)
    	{
    		arr[0] = i;
    		RecursiveFunc(arr, n, n - 1);
    	}
    
    	delete[] arr;
    }
    
    void RecursiveFunc(int arr[], int n, int cur)
    {
    	if (cur == 0)
    	{
    		for (int j = 0; j < n; ++j)
    		{
    			cout << arr[j] << ' ';
    		}
    		cout << endl;
    		return;
    	}
    
    	for (int i = arr[n - (cur + 1)]; i <= 6; ++i)
    	{
    		arr[n - cur] = i;
    		RecursiveFunc(arr, n, cur - 1);
    	}
    }

     

    591 : 함수3 - 자가진단5

    #include <iostream>
    
    using namespace std;
    
    int RecursiveFunc(int n);
    
    int main(void)
    {
    	int n;
    
    	cin >> n;
    
    	cout << RecursiveFunc(n) << endl;
    }
    
    int RecursiveFunc(int n)
    {
    	if (n == 1)
    	{
    		return 1;
    	}
    
    	return RecursiveFunc(n / 2) + RecursiveFunc(n - 1);
    }

     

    592 : 함수3 - 자가진단6

    #include <iostream>
    
    using namespace std;
    
    int RecursiveFunc(int n);
    
    int main(void)
    {
    	int n;
    
    	cin >> n;
    
    	cout << RecursiveFunc(n) << endl;
    }
    
    int RecursiveFunc(int n)
    {
    	if (n == 0)
    	{
    		return 0;
    	}
    
    	int num = n % 10;
    	return num * num + RecursiveFunc(n / 10);
    }

     

    231 : 함수3 - 형성평가1

    #include <iostream>
    
    using namespace std;
    
    void RecursiveFunc(int n);
    
    int main(void)
    {
    	int n;
    
    	cin >> n;
    
    	RecursiveFunc(n);
    	cout << endl;
    }
    
    void RecursiveFunc(int n)
    {
    	if (n == 0)
    		return;
    
    	RecursiveFunc(n / 2);
    
    	cout << n << ' ';
    }

     

    232 : 함수3 - 형성평가2

    #include <iostream>
    
    using namespace std;
    
    void RecursiveFunc(int n);
    
    int main(void)
    {
    	int n;
    
    	cin >> n;
    
    	RecursiveFunc(n);
    	cout << endl;
    }
    
    void RecursiveFunc(int n)
    {
    	if (n <= 0)
    		return;
    
    	RecursiveFunc(n - 2);
    
    	cout << n << ' ';
    }

     

    233 : 함수3 - 형성평가3

    #include <iostream>
    
    using namespace std;
    
    void RecursiveFunc(int arr[], int n, int m, int cur);
    
    int main(void)
    {
    	int n, m;
    
    	cin >> n >> m;
    
    	int* arr = new int[n];
    	RecursiveFunc(arr, n, m, 0);
    
    	delete[] arr;
    }
    
    void RecursiveFunc(int arr[], int n, int m, int cur)
    {
    	if (cur == n)
    	{
    		int sum = 0;
    		for (int i = 0; i < n; ++i)
    		{
    			sum += arr[i];
    		}
    
    		if (sum == m)
    		{
    			for (int i = 0; i < n; ++i)
    			{
    				cout << arr[i] << ' ';
    			}
    			cout << endl;
    		}
    		return;
    	}
    
    	for (int i = 1; i <= 6; ++i)
    	{
    		arr[cur] = i;
    		RecursiveFunc(arr, n, m, cur + 1);
    	}
    }

     

    234 : 함수3 - 형성평가4

     

    헷갈리는 부분은 첫 번째와 두 번째가 정해져 있고 우리의 값은 세 번째 값부터 등장한다는 점 입니다.

    #include <iostream>
    
    using namespace std;
    
    void RecursiveFunc(int n, int pre, int cur, int stage);
    
    int main(void)
    {
    	int n;
    
    	cin >> n;
    
    	RecursiveFunc(n, 1, 2, 2);
    }
    
    void RecursiveFunc(int n, int pre, int cur, int stage)
    {
    	if (stage == n)
    	{
    		cout << cur << endl;
    		return;
    	}
    
    	RecursiveFunc(n, cur, pre * cur % 100, stage + 1);
    }

     

    235 : 함수3 - 형성평가5

    #include <iostream>
    
    using namespace std;
    
    void RecursiveFunc(int n, int count = 0);
    
    int main(void)
    {
    	int n;
    
    	cin >> n;
    
    	RecursiveFunc(n);
    }
    
    void RecursiveFunc(int n, int count)
    {
    	if (n == 1)
    	{
    		cout << count << endl;
    		return;
    	}
    
    	RecursiveFunc((n % 2 == 0) ? (n / 2) : (n / 3), count + 1);
    }

     

    236 : 함수3 - 형성평가6

    #include <iostream>
    
    using namespace std;
    
    void RecursiveFunc(int n, int result = 1);
    
    int main(void)
    {
    	int n1, n2, n3;
    
    	cin >> n1 >> n2 >> n3;
    
    	RecursiveFunc(n1 * n2 * n3);
    }
    
    void RecursiveFunc(int n, int result)
    {
    	if (n == 0)
    	{
    		cout << result << endl;
    		return;
    	}
    
    	RecursiveFunc(n / 10, result *= (n % 10 != 0) ? (n % 10) : 1);
    }

     

    http://www.jungol.co.kr/bbs/board.php?bo_table=pbank&sca=10d0&sfl=&stx=

     

    JUNGOL | 문제은행 1 페이지

    경기도 안양시 동안구 평촌대로 109 협성골드프라자 601호 TEL : 031-360-4144 FAX : 031-388-0996 E-mail : hancomc@hotmail.com, comkiwer@naver.com Copyrightⓒ 2010-2019 jungol. All right reserved. TOP

    www.jungol.co.kr

    댓글

Designed by Tistory.