[BOJ_step_09] 수학2 06 ~ 10

2 분 소요

수학2

수학을 다루는 문제들을 해결해 보자.

직사각형에서 탈출(1085)

1085

문제풀이

직사각형의 내부의 한 점에서 가장 가까운 모서리를 찾는 문제이다.

void solution_1085() {
	int x,y,w,h;
	scanf("%d%d%d%d", &x, &y, &w, &h);
	printf("%d\n", (w - x < x ? w - x : x) < (h - y < y ? h - y : y) ? (w - x < x ? w - x : x) : (h - y < y ? h - y : y));
	/*int a = w - x < x ? w - x: x;
	int b = h - y < y ? h - y: y;
	int c = a < b ? a : b;
	printf("%d\n", c);*/
}

네 번째 점(3009)

3009

문제풀이

세 점 (a,b), (a,d), (c,b) 가 있을 때 정렬을 하면 (사전식 순서) (a,b),(a,d),(c,b)가 된다. 이 때 첫 번째 좌표와 두 번째 좌표를 비교했을 때 같으면 2번 나왔으므로 세 번째 좌표를 출력하고 그렇지 않다면 두 번째 좌표를 출력한다. 이를 x와 y에 대해 따로 생각해준다.

void solution_3009() {
	int x[4], y[4];
	for (int i = 0; i < 3; ++i)
		scanf("%d %d", &x[i], &y[i]);
	sort(x, x + 3);
	sort(y, y + 3);
	printf("%d %d", x[0] == x[1] ? x[2] : x[0], y[0] == y[1] ? y[2] : y[0]);
}

직각삼각형(4153)

4153

문제풀이

피타고라서 정리를 이용하여 직각삼각형인지 아닌지 판별하는 문제.

void solution_4153() {
	while (1) {
		int a[3], tmp;
		for (int i = 0; i < 3; i++)scanf("%d", &a[i]);
		if (a[0] == 0 || a[1] == 0 || a[2] == 0)break;
		if (a[2] * a[2] == a[1] * a[1] + a[0] * a[0])printf("right\n");
		else printf("wrong\n");
	}
}

택시 기하학(3053)

3053

문제풀이

택시기하학에 대한 정리는 다음을 참고하자.
택시기하학

const double PI = 3.14159265358979;

void solution_3053() {
	int r;
	scanf("%d", &r);
	printf("%6f\n", r*r*PI);
	printf("%6f\n", (double)r*r * 2);
}

터렛(1002)

1002

문제풀이

처음에 거리라는 말에 위에서 풀었던 택시기하학을 이용하면 되겠다 싶어서 풀었는데 틀렸다. 아마 문제에서 주어지는 터렛과 적의 거리 자체가 유클리드 기하학에 기반하여 정의되어서 인 것 같다.
문제 해석을 잘 해보면 결국 문제에서 원하는 것은

  • 두 원이 일치하는가?
  • 두 원의 교점이 없는가?
  • 두 원의 교점이 2개인가?
  • 두 원의 교점이 1개인가? (외접하는가 내접하는가?)
    이다.
void solution_1002() {
	int t;
	scanf("%d", &t);
	while (t--) {
		int x1, y1, d1, x2, y2, d2;
		scanf("%d%d%d", &x1, &y1, &d1);
		scanf("%d%d%d", &x2, &y2, &d2);
		int d = (x2 - x1)*(x2 - x1) + (y2 - y1)*(y2 - y1);
		int sum = (d1 + d2)*(d1 + d2);	//두 거리의 합
		int dif = (d1 - d2)*(d1 - d2);  //두 거리의 차
		
		//두 원의 중심이 일치할 때
		if (d == 0) {
			if (dif == 0) printf("-1\n"); //두 원이 일치할 때
			else printf("0\n"); //두 원이 일치하지 않을 때
		}
		else if (d == sum || d == dif)printf("1\n");  //외접할 때, 내접할 때
		else if (dif < d&&d < sum) printf("2\n");  //두 점에서 만날 때
		else printf("0\n");  //만나지 않을 때
	}
}

댓글남기기