※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※

 

이번에 볼 문제는 백준 22940번 문제인 선형 연립 방정식이다.
문제는 아래 링크를 확인하자.

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

 

22940번: 선형 연립 방정식

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

www.acmicpc.net

주어지는 선형 연립 방정식의 각 계수가 10 이하이고, 각 해가 모두 100 이하의 자연수가 되며 변수 또한 6개로 충분히 적으므로 실수 오차에 대한 큰 걱정 없이 실수자료형을 이용한 구현으로 문제를 해결해도 좋다는 점을 관찰하자.

 

가우스-조던 소거법을 구현해 문제를 해결하자.

 

두 실수가 같은지 여부를 판단할 때 "==" 연산자를 사용하는 것은 위험하다. 대신 두 수의 차가 적절한 오차범위 이내에 있는지를 확인하자.

 

아래는 제출한 소스코드이다.

#include <iostream>
#include <vector>
using namespace std;
typedef long double ld;

ld ERROR = 1e-9;

int N;
vector<vector<ld>> mat;

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);

	cin >> N;
	for (int r = 0; r < N; r++) {
		mat.emplace_back(vector<ld>());
		auto& vec = mat.back();
		for (int c = 0; c <= N; c++) {
			ld x; cin >> x;
			vec.emplace_back(x);
		}
	}

	for (int r = 0; r < N; r++) {
		int rr = r;
		while (abs(mat[rr][r]) < ERROR) rr++;
		swap(mat[r], mat[rr]);

		ld coef = mat[r][r];
		for (int c = r; c <= N; c++) mat[r][c] /= coef;

		for (int rrr = 0; rrr < N; rrr++) {
			if (rrr == r) continue;
			ld rrrcoef = mat[rrr][r];
			for (int c = r; c <= N; c++) {
				mat[rrr][c] -= mat[r][c] * rrrcoef;
			}
		}
	}

	cout << fixed;
	cout.precision(0);

	for (int r = 0; r < N; r++) cout << mat[r][N] << ' ';
}
728x90

'BOJ' 카테고리의 다른 글

[BOJ 16685 // C++] XOR 포커  (0) 2023.07.11
[BOJ 11191 // C++] Xor Maximization  (0) 2023.07.10
[BOJ 2201 // C++] 이친수 찾기  (0) 2023.07.08
[BOJ 2248 // C++] 이진수 찾기  (0) 2023.07.08
[BOJ 2230 // C++] 수 고르기  (0) 2023.07.07

+ Recent posts