코딩해요/C

[백준/C언어] 기하: 직사각형 삼각형

yenas0 2024. 1. 7. 02:20
반응형

#27323번_직사각형

문제
정수 A, B 가 주어진다. 세로 길이가 A cm, 가로 길이가 B cm 인 아래와 같은 직사각형의 넓이를 cm^ 단위로 구하시오.

 

풀이
직사각형의 넓이는 (높이) x (밑변)으로 구할 수 있다.

 

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <math.h>

int main(void)
{
	int a, b;

	scanf("%d", &a);
	scanf("%d", &b);

	int result = a * b;
	printf("%d", result);
	return 0;
}

#1085번_직사각형에서 탈출

문제
한수는 지금 (x, y)에 있다. 직사각형은 각 변이 좌표축에 평행하고, 왼쪽 아래 꼭짓점은 (0, 0), 오른쪽 위 꼭짓점은 (w, h)에 있다. 직사각형의 경계선까지 가는 거리의 최솟값을 구하는 프로그램을 작성하시오.

 

풀이



철수의 위치가 (x, y)이므로 직사각형까지의 최단거리는 위 그림에서 회색 거리 중에 하나이다.
x, y, h-y, w-x 중 최솟값을 구해 출력하면 된다.

 

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <math.h>

int main(void)
{
	int x, y, w, h;

	scanf("%d %d %d %d", &x, &y, &w, &h);

	int length[] = { x, y, w - x, h - y };

	int min = length[0];
	for (int i = 1; i < 4; i++) {
		if (min > length[i])
			min = length[i];
	}

	printf("%d", min);

	return 0;
}

#3009번_네 번째 점

문제
세 점이 주어졌을 때, 축에 평행한 직사각형을 만들기 위해서 필요한 네 번째 점을 찾는 프로그램을 작성하시오.

 

풀이



별표친 좌표를 구해야하는 문제이다. 입력으로는 나머지 3개의 좌표를 입력하게 된다.
별표 친 좌표의 x좌표와 y좌표는 주어진 3개의 좌표에서 1번씩 나온 값을 취하면 된다.

즉 예를 들어, (7,5) (4,5) (4,8)이 주어진 경우
x좌표는 4가 2번, 7이 1번 나왔으므로 7이되고, y좌표는 5가 2번 8이 1번 나왔으므로 8이된다.
따라서 구하는 좌표의 값은 (7,8)로 구할 수 있다.

위의 예시 방법을 사용해서 각각의 x배열과 y배열을 0값으로 초기화 해둔 뒤, 값이 입력된다면 1과 XOR 연산하여 다시 값을 저장한다.

XOR 연산을 다 끝내고 나면 한번 씩 입력된 값들은 배열의 값이 1이 된다. 좌표를 구하기 위해서는 배열의 값이 1인 인덱스를 찾아 좌표값으로 취하면 된다.

 

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <math.h>

int main(void)
{
	int arr_x[1000] = { 0 };
	int arr_y[1000] = { 0 };

	for (int i = 0; i < 3; i++) {
		int a, b;
		scanf("%d %d", &a, &b);
		arr_x[a - 1] ^= 1;
		arr_y[b - 1] ^= 1;
	}

	int x, y;

	for (int i = 0; i < 1000; i++) {
		if (arr_x[i] == 1) {
			x = i + 1;
		}
	}

	for (int i = 0; i < 1000; i++) {
		if (arr_y[i] == 1) {
			y = i + 1;
		}
	}

	printf("%d %d", x, y);
	return 0;
}

#15894번_수학은 체육과목 입니다

문제
"한 변의 길이가 1인 정사각형을 아래 그림과 같이 겹치지 않게 빈틈없이 계속 붙여 나간다. 가장 아랫부분의 정사각형이 n개가 되었을 때, 실선으로 이루어진 도형의 둘레의 길이를 구하시오."

가장 아랫부분의 정사각형 개수가 주어지면 그에 해당하는 답을 출력하는 프로그램을 만들어 형석이를 도와주자!

 

풀이



n이 1일때부터 대입해보면서 규칙성을 찾아 일반항을 구한 뒤 출력한다. 

 

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <math.h>

int main(void)
{
	long long n;

	scanf("%lld", &n);

	long long result = 4 * n;

	printf("%lld", result);

	return 0;
}

#9063번_대지

문제
임씨의 이름이 새겨진 옥구슬의 위치 N 개가 주어질 때에, 임씨에게 돌아갈 대지의 넓이를 계산하는 프로그램을 작성하시오. 단, 옥구슬의 위치는 2 차원 정수 좌표로 주어지고 옥구슬은 같은 위치에 여러 개가 발견될 수도 있으며, x 축의 양의방향을 동쪽, y 축의 양의방향을 북쪽이라고 가정한다. 

 

풀이



위 그림은 n이 3과 4일 때의 대지의 모양 예시이다.

즉, 입력받은 좌표에서 가장 큰 x값에서 가장 작은 x값은 뺀것이 가로길이가 되고, 입력받은 좌표에서 가장 큰 y값에서 가장 작은 y값을 뺀 것이 세로의 길이가 된다.

반복문을 통해 min_x, max_x, min_y, max_y값을 구해 가로,세로길이를 구하고 두 값을 곱해 넓이를 출력한다.

 

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
	int n;
	scanf("%d", &n);

	int* a = (int*)malloc(n * sizeof(int));
	int* b = (int*)malloc(n * sizeof(int));

	for (int i = 0; i < n; i++) {
		scanf("%d %d", &a[i], &b[i]);
	}

	int min_x = a[0];
	int max_x = a[0];
	int min_y = b[0];
	int max_y = b[0];

	for (int i = 0; i < n; i++) {
		if (min_x > a[i])
			min_x = a[i];
		if (max_x < a[i])
			max_x = a[i];
		if (min_y > b[i])
			min_y = b[i];
		if (max_y < b[i])
			max_y = b[i];
	}

	free(a);
	free(b);

	int result = (max_x - min_x) * (max_y - min_y);
	printf("%d", result);

	return 0;
}

#10101번_삼각형외우기

문제
창영이는 삼각형의 종류를 잘 구분하지 못한다. 따라서 프로그램을 이용해 이를 외우려고 한다.
삼각형의 세 각을 입력받은 다음, 
  • 세 각의 크기가 모두 60이면, Equilateral
  • 세 각의 합이 180이고, 두 각이 같은 경우에는 Isosceles
  • 세 각의 합이 180이고, 같은 각이 없는 경우에는 Scalene
  • 세 각의 합이 180이 아닌 경우에는 Error
를 출력하는 프로그램을 작성하시오.

 

풀이

1.  if문을 사용해서 삼각형이 성립되지 않는 경우와 성립되는 경우를 분류한다.
2. 같은 각이 없는 경우를 분류한다.
3. 두 각이 같은 경우를 분류한다.
4. 세 각이 같은 경우를 분류한다.

 

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
	int a, b, c;
	scanf("%d", &a);
	scanf("%d", &b);
	scanf("%d", &c);

	if (a + b + c == 180) {
		if (a != b && b != c && a != c)
			printf("Scalene");
		else if ((a == b && b != c) || (a != b && b == c) || (a == c && b != c))
			printf("Isosceles");
		else if (a == b && b == c)
			printf("Equilateral");
	}

	else
		printf("Error");

	return 0;
}

#5073번_삼각형과 세변

문제
삼각형의 세 변의 길이가 주어질 때 변의 길이에 따라 다음과 같이 정의한다.
  • Equilateral :  세 변의 길이가 모두 같은 경우
  • Isosceles : 두 변의 길이만 같은 경우
  • Scalene : 세 변의 길이가 모두 다른 경우
단 주어진 세 변의 길이가 삼각형의 조건을 만족하지 못하는 경우에는 "Invalid" 를 출력한다. 예를 들어 6, 3, 2가 이 경우에 해당한다. 가장 긴 변의 길이보다 나머지 두 변의 길이의 합이 길지 않으면 삼각형의 조건을 만족하지 못한다.
세 변의 길이가 주어질 때 위 정의에 따른 결과를 출력하시오.

 

풀이

1. 무한루프를 생성하고 입력된 값이 모두 0일 때만 루프를 빠져나가도록 구성한다.
2. 입력된 세 값중 가장 큰 값을 구해 max변수에 대입한다.
3. 삼각형 성립 조건을 만족하는지 판단한다.
4. 삼각형이 성립된다면 어떤 삼각형인지 판단한다.

 

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
	int a, b, c;

	while (1) {
		scanf("%d %d %d", &a, &b, &c);

		if (a == 0 && b == 0 && c == 0)
			break;

		int max = a;
		if (max < b)
			max = b;
		if (max < c)
			max = c;

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

		else
			printf("Invalid\n");
	}

	return 0;
}

#14215번_세 막대 

문제
영선이는 길이가 a, b, c인 세 막대를 가지고 있고, 각 막대의 길이를 마음대로 줄일 수 있다.
영선이는 세 막대를 이용해서 아래 조건을 만족하는 삼각형을 만들려고 한다.
  • 각 막대의 길이는 양의 정수이다
  • 세 막대를 이용해서 넓이가 양수인 삼각형을 만들 수 있어야 한다.
  • 삼각형의 둘레를 최대로 해야 한다.
a, b, c가 주어졌을 때, 만들 수 있는 가장 큰 둘레를 구하는 프로그램을 작성하시오. 

 

풀이

1. 주어진 값 중 가장 큰 값을 max변수에 대입한다.
2. 가장 큰 변을 제외한 나머지 변들의 핪을 r에 대입한다.
3. 삼각형이 성립한다면 주어진 값을 그냥 더한 후 출력한다.
4. 삼각형이 성립하지 않는다면 가장 큰 변의 크기(max)를 나머지 변들의 합(r)의 값보다 1이 작도록 바꾼다.
5. 변경된 max값과 r값을 더해 출력한다.

 

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
	int a, b, c;

	scanf("%d %d %d", &a, &b, &c);

	int max = a;
	if (max < b)
		max = b;
	if (max < c)
		max = c;

	int r = a + b + c - max;

	if (max >= r)
	{
		max = r - 1;
		printf("%d", r + max);
	}

	else
		printf("%d", a + b + c);

	return 0;
}
반응형