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;
}