https://www.acmicpc.net/problem/7561
3 X 3 동차선형연립방정식을 크래머의 공식을 이용하여 풀어내라는 문제다.
선형대수학에 나오는 개념이며, Determinant(행렬식)의 개념을 알고 있으면 문제를 이해하기 쉽다.
크래머 공식을 단순 구현하는 문제이긴 부동소수점을 조절해주어야 하고, 선형대수학에 나오는 개념을 미리 알고 있는 사람이 아니면 생각보다 코드를 작성하기 시작하는데 오래걸릴거 같다.
각 원소의 범위가 -1000 ~ 1000이므로 행렬식을 계산하는 도중에 int형 범위를 넘어갈 수 있음에 유의하자.
#include <stdio.h>
#define ep 0.0005
#define lint long long
using namespace std;
lint n, detA, detA1, detA2, detA3;
lint a[4][4], b[4];
double x1, x2, x3;
lint det(int col){
lint copyA[4][4];
for(int i = 0; i < 4; i++){
for(int j = 0; j < 4; j++){
copyA[i][j] = a[i][j];
}
}
for(int i = 1; i <= 3; i++){
copyA[i][col] = b[i];
}
lint d = 0;
d += copyA[1][1]*(copyA[2][2]*copyA[3][3]-copyA[2][3]*copyA[3][2]);
d -= copyA[1][2]*(copyA[2][1]*copyA[3][3]-copyA[2][3]*copyA[3][1]);
d += copyA[1][3]*(copyA[2][1]*copyA[3][2]-copyA[2][2]*copyA[3][1]);
return d;
}
int main() {
scanf("%lld", &n);
while(n--){
for(int i = 1; i <= 3; i++){
for(int j = 1; j <= 3; j++){
scanf("%lld", &a[i][j]);
}
scanf("%lld", &b[i]);
}
detA = det(0);
detA1 = det(1);
detA2 = det(2);
detA3 = det(3);
printf("%lld %lld %lld %lld\n", detA1, detA2, detA3, detA);
if(!detA) printf("No unique solution\n\n");
else{
x1 = (double)detA1/detA; x2 = (double)detA2/detA; x3 = (double)detA3/detA;
if(-ep < x1 && x1 < ep) x1 = 0;
if(-ep < x2 && x2 < ep) x2 = 0;
if(-ep < x3 && x3 < ep) x3 = 0;
printf("Unique solution: %.3lf %.3lf %.3lf\n\n",x1,x2,x3);
}
}
}
'📚알고리즘 > 백준' 카테고리의 다른 글
[백준 31443번] 준영이 (C++) (0) | 2024.07.17 |
---|---|
[백준 24025번] 돌의 정령 줄세우기 (C++) (0) | 2024.07.16 |
[백준 31404번] 아리스, 청소합니다! (Easy) (C++) (0) | 2024.07.03 |
[백준 2206번] 벽 부수고 이동하기 (C++) (0) | 2024.07.03 |
[백준 1437번] 수 분해 (C++) (0) | 2024.06.23 |