문제 풀이

BOJ 22940 : 선형 연립 방정식 [C++]

khj20006 2023. 1. 31. 06:00
반응형

 

https://www.acmicpc.net/problem/22940

 

22940번: 선형 연립 방정식

하나 이상의 미지수에 대해 최고차항의 차수가 1을 넘지 않는 방정식을 선형 방정식이라 한다. 족, 다음과 같은 식을 의미한다. A1x1 + A2x2 + ... + Anxn = B 선형 연립 방정식이란 유한개의 선형 방

www.acmicpc.net

 

문제 요약

주어지는 연립 방정식의 해를 구하는 문제이다.

 

접근

행렬 크기의 제한이 6 X 6으로 매우 넉넉하다.

가우스 소거법을 직접 구현하면 된다.

가우스 소거법을 모르더라도, 연립 방정식을 푸는 과정을 직접 코드로 구현하자.

어느 쪽이던 다소 번거로운 것 같다.

 

#include <iostream>
using namespace std;

int main() {
	int N;
	double map[6][6]{};
	double ans[6]{};
	double real[6]{};
	cin >> N;
	for (int i = 0; i < N; i++) {
		for (int j = 0; j < N; j++)	cin >> map[i][j];
		cin >> ans[i];
	}
	for (int i = 0; i < N; i++) {
		double pivot = map[i][i];
		if (pivot == 0) {
			for (int temp = i + 1; temp < N; temp++) {
				if (map[temp][i]) {
					for (int k = i; k < N; k++)	swap(map[i][k], map[temp][k]);
					swap(ans[i], ans[temp]);
					pivot = map[i][i];
					break;
				}
			}
		}
		for (int j = i + 1; j < N; j++) {
			double now = map[j][i];
			for (int k = i; k < N; k++) {
				map[j][k] += (map[i][k] * -1 * now / pivot);
			}
			ans[j] += (ans[i] * -1 * now / pivot);
		}
	}
	for (int i = N - 1; i >= 0; i--) {
		double g = ans[i];
		for (int j = N - 1; j > i; j--) {
			g -= real[j] * map[i][j];
		}
		real[i] = g / map[i][i];
	}
	for (int i = 0; i < N; i++)	cout << real[i] << ' ';
}

 

반응형