알고리즘/정보올림피아드(정올)

정올 - 알고리즘 문제 풀이

4과 2026. 9. 18. 20:53

koala 알고리즘 동아리 24기


1. [1306] 팩토리얼

문제 링크: https://jungol.co.kr/problem/1309
문제: 팩토리얼
1부터 어떤 양의 정수 n까지의 정수를 모두 곱한 것을 말하며 n!로 나타낸다.
0! = 1
1! = 1
2! = 2
n! = n * (n-1)!

와 같이 정의된다.
예로 4! = 4×3×2×1 = 24 이다.
n! 이 주어졌을 때 결과를 출력하는 프로그램을 작성하라.
* 결과가 int범위를 넘는 경우 자료형 long long 입력/출력 서식문자 %lld 를 사용한다.
 
풀이
정수 n을 입력받아 팩토리얼을 계산한다.
팩토리얼은 1부터 n까지 모든 자연수를 곱하는 연산이므로 n! = n * (n-1)!로 정의할 수 있다. 자기 자신을 이용해 다음 값을 정의하는 구조이기 때문에 재귀함수를 이용하면 간결하게 작성이 가능하다.
 
func 함수를 정의하여 return으로 n! = n * (n-1)!  결과값으로 자기 자신 함수를 호출하는 재귀 함수 형태를 만든다. 

#include <stdio.h>

long long func(int n);

int main()
{
    int num = 0;
    long long result = 0;
    scanf("%d", &num);
    result = func(num);

    printf("%lld", result);
        
}

long long func(int a)
{
        if(a>1)
        {
            printf("%d! = %d * %d!\n", a, a, a-1);
        }
        else
        {
            printf("1! = 1\n");
            return 1;
        }
        return a * func(a-1);
}

 
 
재귀함수를 이용하지 않고 반복문을 활용해 풀이도 가능하다.
for문과 연산 과정을 담을 result 변수를 이용하여 n! = n * (n-1)!의 다음값을 정의하는 구조를 구현할 수 있다.

#include <stdio.h>

int main()
{
    int num = 0;
    long long result = 0;
    scanf("%d", &num);
    result = num;

    for (int i=num; i > 0; i--)
    {
        if(i>1)
        {
            result = result *(i-1);
            printf("%d! = %d * %d!\n", i, i, i-1);
        }
        else
        {
            printf("1! = 1\n");
        }
    }
    printf("%lld", result);
        
}

2. [6173] 별찍기 정복 

문제링크: https://jungol.co.kr/problem/6173
문제
정수 N을 입력받아 출력형식에 맞춰 출력하시오.
 
풀이
정수 N을 입력받아 N만큼 문자 a가 +1씩 늘어나는 오름차순 구조이므로 반복문을 이용한다.
이중 반복문을 이용하여 줄바꿈과 문자 a개수를 조절한다 

#include <stdio.h>

int main() {
	int num = 0;
	scanf("%d", &num);

	for (int i = 0; i < num; i++)
	{
		for(int j = 0; j < i+1; j++)
		{
			printf("a ");
		}
		printf("\n");
	}
	return 0;
}

3. [12334] 삼각형 판별

문제링크: https://jungol.co.kr/problem/12334
문제
세 정수 a, b, c가 주어진다.
각 정수는 어떤 선분의 길이를 의미한다.
이 세 선분을 이용해 삼각형을 만들 수 있는지 판별하라.
삼각형을 만들 수 있다면 YES를, 만들 수 없다면 NO를 출력한다.
 
풀이
삼각형은 세 변의 길이 중 가장 긴 변의 길이가 나머지 두 변의 길이의 합보다 작아야 한다.
세 변의 길이는 arr배열에 저장하여 버블 정렬을 이용해 오름차순으로 정렬한다.
가장 긴 변의 길이가 나머지 변의 합보다 작은지 if문을 활용해 삼각형의 조건을 만족하는지 확인한다. 

#include <stdio.h>

int main() {

	int arr[3];
	int temp = 0;

	scanf("%d %d %d", &arr[0], &arr[1], &arr[2]);
	for(int i = 0; i < 2; i++)
	{
		if(arr[i] > arr[i+1])
		{
			temp = arr[i];
			arr[i] = arr[i+1];
			arr[i+1] = temp;
		}
	}
	if(arr[0]+arr[1] > arr[2])
	{
		printf("YES");
	}
	else
	{
		printf("NO");
	}
	return 0;
}