[랜덤 마라톤] 실수(24057)

lhs's avatar
Dec 21, 2024
[랜덤 마라톤] 실수(24057)
notion image
notion image

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

LHS's Study Space