From dc6547fbdc64bb63ea5bc8c32f5672c4859658dd Mon Sep 17 00:00:00 2001 From: Jonghwan Lee <123362165+0224LJH@users.noreply.github.com> Date: Wed, 13 Aug 2025 23:41:50 +0900 Subject: [PATCH] =?UTF-8?q?[20250813]=20BOJ=20/=20G3=20/=20=EA=B8=88?= =?UTF-8?q?=EA=B3=A0=20=EC=97=B4=EA=B8=B0=20/=20=EC=9D=B4=EC=A2=85?= =?UTF-8?q?=ED=99=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...0\352\263\240 \354\227\264\352\270\260.md" | 70 +++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 "13 BOJ \352\270\210\352\263\240 \354\227\264\352\270\260.md" diff --git "a/13 BOJ \352\270\210\352\263\240 \354\227\264\352\270\260.md" "b/13 BOJ \352\270\210\352\263\240 \354\227\264\352\270\260.md" new file mode 100644 index 00000000..8ccbd253 --- /dev/null +++ "b/13 BOJ \352\270\210\352\263\240 \354\227\264\352\270\260.md" @@ -0,0 +1,70 @@ +```java +import java.io.*; +import java.util.*; + +public class Main { + + static final double EPS = 1e-6; + static StringBuilder sb = new StringBuilder(); + + public static void main(String[] args) throws Exception { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + int size = Integer.parseInt(br.readLine()); + + for (int t = 0; t < size; t++) { + StringTokenizer st = new StringTokenizer(br.readLine()); + double[] nums = new double[4]; + for (int i = 0; i < 4; i++) nums[i] = Double.parseDouble(st.nextToken()); + + boolean ok = canMake24(nums); + sb.append(ok ? "YES" : "NO").append('\n'); + } + System.out.print(sb.toString()); + } + + private static boolean canMake24(double[] arr) { + List list = new ArrayList<>(4); + for (double v : arr) list.add(v); + return dfs(list); + } + + private static boolean dfs(List nums) { + int n = nums.size(); + if (n == 1) { + return Math.abs(nums.get(0) - 24.0) < EPS; + } + + // 두 수 선택해서 하나로 줄이기 + for (int i = 0; i < n; i++) { + for (int j = i + 1; j < n; j++) { + double a = nums.get(i), b = nums.get(j); + List nextCandidates = new ArrayList<>(6); + + // 덧셈/곱셈은 교환법칙이 있어 한 번만 추가 + nextCandidates.add(a + b); + nextCandidates.add(a * b); + + // 뺄셈/나눗셈은 순서가 중요하므로 양쪽 모두 시도 + nextCandidates.add(a - b); + nextCandidates.add(b - a); + if (Math.abs(b) > EPS) nextCandidates.add(a / b); + if (Math.abs(a) > EPS) nextCandidates.add(b / a); + + // 선택한 두 수를 제외한 나머지에 후보 결과를 붙여서 재귀 + for (double cand : nextCandidates) { + List next = new ArrayList<>(n - 1); + for (int k = 0; k < n; k++) { + if (k == i || k == j) continue; + next.add(nums.get(k)); + } + next.add(cand); + + if (dfs(next)) return true; // 해 찾으면 바로 종료 + } + } + } + return false; + } +} + +``` \ No newline at end of file