From 6366f14ecc6e58cadb3b8787bfce16ff199d184b Mon Sep 17 00:00:00 2001 From: sukangpunch Date: Tue, 31 Mar 2026 17:29:46 +0900 Subject: [PATCH] =?UTF-8?q?BOJ=202143:=20=EB=91=90=20=EB=B0=B0=EC=97=B4?= =?UTF-8?q?=EC=9D=98=20=ED=95=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sukangpunch.java" | 100 ++++++++++++++++++ 1 file changed, 100 insertions(+) create mode 100644 "weekly/week13/BOJ_2143_\353\221\220\353\260\260\354\227\264\354\235\230\355\225\251/sukangpunch.java" diff --git "a/weekly/week13/BOJ_2143_\353\221\220\353\260\260\354\227\264\354\235\230\355\225\251/sukangpunch.java" "b/weekly/week13/BOJ_2143_\353\221\220\353\260\260\354\227\264\354\235\230\355\225\251/sukangpunch.java" new file mode 100644 index 0000000..9f9f318 --- /dev/null +++ "b/weekly/week13/BOJ_2143_\353\221\220\353\260\260\354\227\264\354\235\230\355\225\251/sukangpunch.java" @@ -0,0 +1,100 @@ +package study.week13; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +// 두 배열의 합 +// 부분합, 투포인터 +/** + * 시간복잡도 : O(N^2) + * 요소에 음수가 있을 줄 몰라서 잘못 접근을 했다. + * 해결의 키 포인트는, 각 배열에사 나올 수 있는 부분배열 값들을 구한 뒤 오름차순 정렬(중복값은 Map으로 카운팅) 하는 것 + * 정렬된 중복없는 A배열을 0부터, B배열을 B.size()-1 부터 탐색하여 두 합이 T가 되는지를 확인한다. + * 이 때, 각 배열의 Map 에서 해당 요소의 개수만큼 조합이 나오므로 aCount * bCount 결과를 result에 더한다. + * 오름 차순 정렬이므로,현재 A값 B값의 조합은 유일하므로, 둘다 left++, right-- 로 넘어간다. + * 만약 T보다 크다면 right를 줄여서 작은 수로 더하고, T보다 작다면 left 를 증가시켜 더 큰 수를 더한다. + * 물론 A를 right 로 B를 left 로 두고 연산해도 문제 없음 + */ +public class BOJ_2143 { + + public static void main(String[] args) throws IOException { + BufferedReader br =new BufferedReader(new InputStreamReader(System.in)); + + int T = Integer.parseInt(br.readLine()); + + int AN = Integer.parseInt(br.readLine()); + String []inputA = br.readLine().split(" "); + int [] A = new int[AN]; + for(int i=0; i aCnt = new HashMap<>(); + Map bCnt = new HashMap<>(); + + for(int i=0; i AList = new ArrayList<>(aCnt.keySet()); + List BList = new ArrayList<>(bCnt.keySet()); + Collections.sort(AList); + Collections.sort(BList); + + long result = 0; + int left = 0; + int right = BList.size() - 1; + + while(left < AList.size() && right >=0){ + int curA = AList.get(left); + int curB = BList.get(right); + int sum =curA + curB; + + if(sum == T){ + int aCount = aCnt.get(curA); + int bCount = bCnt.get(curB); + + result += ((long) aCount * bCount); + left++; + right--; + }else if(sum < T){ + left++; + }else{ + right--; + } + } + + return result; + } +}