Mentoring

[멘토링][c언어]백준 5073번, 10872번, 2576번

seomj 2020. 5. 12. 13:29

백준 5073번: 삼각형과 세 변

문제

삼각형의 세 변의 길이가 주어질 때 변의 길이에 따라 다음과 같이 정의한다.

  • Equilateral :  세 변의 길이가 모두 같은 경우
  • Isosceles : 두 변의 길이만 같은 경우
  • Scalene : 세 변의 길이가 모두 다른 경우

단 주어진 세 변의 길이가 삼각형의 조건을 만족하지 못하는 경우에는 "Invalid" 를 출력한다. 예를 들어 6, 3, 2가 이 경우에 해당한다. 가장 긴 변의 길이보다 나머지 두 변의 길이의 합이 길지 않으면 삼각형의 조건을 만족하지 못한다.

세 변의 길이가 주어질 때 위 정의에 따른 결과를 출력하시오.

입력

각 줄에는 1,000을 넘지 않는 양의 정수 3개가 입력된다. 마지막 줄은 0 0 0이며 이 줄은 계산하지 않는다.

출력

각 입력에 맞는 결과 (Equilateral, Isosceles, Scalene, Invalid) 를 출력하시오.

 

#include  <stdio.h>

void triangle(a, b, c, max);
int get_max(a, b, c, max);

void main()
{
	int a, b, c;
	scanf_s("%d %d %d", &a, &b, &c);
	int max = 0;

	while (a != 0 && b != 0 && c != 0) {
		max = get_max(a, b, c, max);
		triangle(a, b, c, max);
		scanf_s("%d %d %d", &a, &b, &c);
	}
	
 }

int get_max(a, b, c, max)
{
	if (a > b)
		if (a > c) {
			max = a;
		}
		else {
			max = c;
		}
	else {
		if (b > c) {
			max = b;
		}
		else {
			max = c;
		}
	}
	return max;
}

void triangle(a, b, c, max)
{
	if (max < ((a + b + c) - max))
	{
		if (a == b && a == c) {
			printf("Equilateral \n");
		}
		else if (a == b && a != c || a == c && a != b || b == c && b != a)
		{
			printf("Isosceles \n");
		}
		else
		{
			printf("Scalene \n");
		}
	}
	else
	{
		printf("Invalid \n");
	}
}

3일동안 풀었다.. 풀고나니 내가 관계연산자와 논리연산자를 잘못 주어서 풀지 못하고 있었다.. 

 

근데 백준에다 저 코드를 입력하면 런타임에러가 뜬다...


백준 10872번: 팩토리얼

문제

0보다 크거나 같은 정수 N이 주어진다. 이때, N!을 출력하는 프로그램을 작성하시오.

입력

첫째 줄에 정수 N(0 ≤ N ≤ 12)가 주어진다.

출력

첫째 줄에 N!을 출력한다.

#include <stdio.h>

int main() {
	int n;
	scanf_s("%d", &n);
	int res=1;

	for (int i = n; i > 0; i--) {
		res = res * i;
	}

	printf("%d", res);
	return 0;
}

위에는 내가 직접 푼 코드이다.

 

재귀함수를 이용해서 풀면

#include <stdio.h>

int multiply(num) {
	if (num > 1) {
		return num * multiply(num - 1);
	}
	else
		return 1;
}
int main() {
	int n;

	scanf_s("%d", &n);
	printf("%d \n", multiply(n));

	return 0;
}

백준 2576번: 홀수

문제

7개의 자연수가 주어질 때, 이들 중 홀수인 자연수들을 모두 골라 그 합을 구하고, 고른 홀수들 중 최솟값을 찾는 프로그램을 작성하시오.

예를 들어, 7개의 자연수 12, 77, 38, 41, 53, 92, 85가 주어지면 이들 중 홀수는 77, 41, 53, 85이므로 그 합은

77 + 41 + 53 + 85 = 256

이 되고,

41 < 53 < 77 < 85

이므로 홀수들 중 최솟값은 41이 된다.

입력

입력의 첫째 줄부터 일곱 번째 줄까지 한 줄에 하나의 자연수가 주어진다. 주어지는 자연수는 100보다 작다.

출력

홀수가 존재하지 않는 경우에는 첫째 줄에 -1을 출력한다. 홀수가 존재하는 경우 첫째 줄에 홀수들의 합을 출력하고, 둘째 줄에 홀수들 중 최솟값을 출력한다.

 

#include  <stdio.h>

int main() {
	int list[7];
	int sum = 0, min = 100;

	for (int i = 0; i < 7; i++) {
		scanf_s("%d", &list[i]);
	}

	for (int i = 0; i < 7; i++) { 
		if (list[i] % 2 == 1) { 
			sum += list[i];
			if (list[i] < min)
				min = list[i];
		}
	}

	if (sum == 0)
		printf("-1");
	else
		printf("%d\n%d", sum, min);

	return 0;
}

14번째 이후로는 코드를 모르겠어서 검색하여 풀었다...

조건문에서 조건식을 sum으로 줄 생각을 하지 못했었다...

 

#include  <stdio.h>

int main() {
	int arr[7];
	int sum = 0, min = 100;

	for (int i = 0; i < 7; i++) { 
        scanf_s("%d", &arr[i]);
		if (arr[i] % 2 == 1) { 
			sum += arr[i];
			if (arr[i] < min)
				min = arr[i];
		}
	}

	if (sum == 0)
		printf("-1");
	else
		printf("%d\n%d", sum, min);

	return 0;
}

멘토링 검사 후 수정한 코드이다.