※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 22940번 문제인 선형 연립 방정식이다.
문제는 아래 링크를 확인하자.
https://www.acmicpc.net/problem/22940
주어지는 선형 연립 방정식의 각 계수가 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 |