

1. 문제 풀이 아이디어
- 수학적으로 계산하는 함수를 만들어 문제를 해결할 수 있다.
2. 나의 정답 코드
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
StringBuilder stringBuilder = new StringBuilder();
long[] a = new long[4];
long[] b = new long[4];
StringTokenizer stringTokenizer = new StringTokenizer(bufferedReader.readLine());
for (int i = 0; i < 4; i++) {
a[i] = Long.parseLong(stringTokenizer.nextToken());
}
stringTokenizer = new StringTokenizer(bufferedReader.readLine());
for (int i = 0; i < 4; i++) {
b[i] = Long.parseLong(stringTokenizer.nextToken());
}
long[][] result = new long[4][4];
result[0][0] = a[0] * b[0];
result[0][3] = a[3];
result[1][0] = result[0][0];
result[1][3] = result[0][3];
for (int i = 1; i < 3; i++) {
result[0][i] = a[i] * b[0] + b[i] * a[0];
result[1][i] = a[i] * b[0] - b[i] * a[0];
}
result[2][0] = a[0] * b[0];
long[] mul = multiple(a[1], a[2], a[3], b[1], b[2]);
result[2][1] = mul[0];
result[2][2] = mul[1];
result[2][3] = a[3];
result[3][3] = result[0][3];
long[] divU = multiple(a[1], a[2], a[3], b[0], 0);
long[] divD = multiple(b[1], b[2], a[3], a[0], 0);
long[] divU2 = multiple(divU[0], divU[1], a[3], divD[0], -divD[1]);
long[] divD2 = multiple(divD[0], divD[1], a[3], divD[0], -divD[1]);
result[3][0] = divD2[0];
result[3][1] = divU2[0];
result[3][2] = divU2[1];
for (int i = 0; i < 4; i++) {
gcd(result[i]);
for (int j = 0; j < 4; j++) {
stringBuilder.append(result[i][j]).append(' ');
}
stringBuilder.append('\n');
}
System.out.println(stringBuilder);
bufferedReader.close();
}
private static void gcd(long[] arr) {
long gcd = gcd(arr[0], arr[1], arr[2]);
boolean chk = arr[0] < 0;
for (int i = 0; i < 3; i++) {
arr[i] = arr[i] / gcd * (chk ? -1 : 1);
}
if (arr[2] == 0)
arr[3] = 0;
}
private static long[] multiple(long a1, long a2, long a3, long b1, long b2) {
return new long[]{a1 * b1 + a2 * b2 * a3, a1 * b2 + b1 * a2};
}
private static long gcd(long a, long b, long c) {
long gcd = gcd(a, b);
return Math.abs(gcd(gcd, c));
}
private static long gcd(long a, long b) {
if (b == 0) return a;
if (a % b == 0) return b;
return gcd(b, a % b);
}
}
3. 정리
- 세 수의 최대공약수(GCD)를 구하는
gcd
메서드를 정의한다.
- 실수의 곱을 계산하는
multiple
메서드를 정의한다.
- 모든 결과를 저장할
result
2차원 배열을 만들어, 0은 덧셈, 1은 뺄셈, 2는 곱셈, 3은 나눗셈의 결과를 저장한다.
- 각 연산을 통해 계산한 후,
gcd
메서드를 사용하여 결과를 조건에 맞게 수정하여 문제를 해결한다.
Share article