문제 풀이
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] << ' ';
}
반응형