본문 바로가기

알고리즘 · 코딩

[SWEA 1245] 균형점

SWEA 1245. [S/W 문제해결 응용] 2일차 - 균형점

문제 링크

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV15MeBKAOgCFAYD#none 

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com


C++ 풀이

#include <iostream>
#include <cmath>
using namespace std;

int N; //자성체 개수
double x[10], weight[10]; //좌표, 무게 배열

//두 자성체 사이의 균형점 위치 찾기
void find_val_point(int index, double x1, double x2) {
	double mid, cal;
	int count = 100; //계산 반복 횟수

	//이분탐색 반복
	while (count > 0) {
		cal = 0;
		mid = (x1 + x2) / 2.0;

		for (int i = 0; i <= index; ++i)
			cal += weight[i] / ((x[i] - mid) * (x[i] - mid));

		for (int i = index + 1; i < N; ++i)
			cal -= weight[i] / ((x[i] - mid) * (x[i] - mid));

		//오차 허용
		if (abs(cal) <= pow(10,-13))
			break;

		else if (cal > 0)
			x1 = mid;

		else if (cal < 0)
			x2 = mid;

		--count;
	}
	printf(" %.10f", mid);
}

int main() {
	int T;;
	cin >> T;
	for (int i = 1; i <= T; ++i) {
		cin >> N;

		//자성체 좌표 저장
		for (int j = 0; j < N; ++j)
			cin >> x[j];

		//자성체 무게 저장
		for (int j = 0; j < N; ++j)
			cin >> weight[j];

		printf("#%d", i);
		for (int j = 0; j < N - 1; ++j)
			find_val_point(j, x[j], x[j + 1]);
		printf("\n");
	}
	return 0;
}

이분탐색 방법을 활용하여 두 자성체 사이의 균형점을 계산하였다.

 

 

LIST

'알고리즘 · 코딩' 카테고리의 다른 글

[SWEA 1221] GNS  (0) 2021.10.21
[SWEA 1213] String  (0) 2021.10.20
[SWEA 1266] 소수 완제품 확률  (0) 2021.10.19
[SWEA 1206] View  (0) 2021.10.18
[SWEA 1240] 단순 2진 암호코드  (0) 2021.10.18