From 08a11c2ab38cda64f38c97e9b5a31ec6de918eee Mon Sep 17 00:00:00 2001 From: IAM <83930018+syslians@users.noreply.github.com> Date: Sun, 20 Jul 2025 22:06:54 +0900 Subject: [PATCH 1/4] Create Set.java MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 백준 11723 --- Set.java | 45 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 Set.java diff --git a/Set.java b/Set.java new file mode 100644 index 0000000..355e03c --- /dev/null +++ b/Set.java @@ -0,0 +1,45 @@ +import java.io.*; +import java.util; + +public class Main { + public static void main(String[] args) throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + StringBuilder sb = new StringBuilder(); + int M = Integer.parseInt(br.readLine()); // 연산 수 입력 + int set = 0; // 비트마스크로 집합 표현 (초기 공집합) + + for (int i = 0; i < M; i++) { + StringTokenizer st = new StringTokenizer(br.readLine()); + String operation = st.nextToken(); // 연산 명령어 + int x; + + switch (operation) { + case "add": + x = Integer.parseInt(st.nextToken()); + set |= (1 << (x - 1)); // x번째 비트를 1로 설정 (추가) + break; + case "remove": + /**/ + case "check": + x = Integer.parseInt(st.nextToken()); + if ((set & (1 << (x - 1))) != 0) { // x번째 비트가 1인지 확인 + /**/ + } + break; + case "toggle": + x = Integer.parseInt(st.nextToken()); + set ^= (1 << (x - 1)); // x번째 비트를 반전 + break; + case "all": + set = (1 << 20) - 1; // 1~20 비트를 모두 1로 설정 + break; + case "empty": + set = 0; // 모든 비트를 0으로 설정 + break; + } + } + + System.out.print(sb); // 결과 출력 + br.close(); + } +} From 8fb2abc590792845947711883fea499446a3157f Mon Sep 17 00:00:00 2001 From: IAM <83930018+syslians@users.noreply.github.com> Date: Fri, 25 Jul 2025 19:44:11 +0900 Subject: [PATCH 2/4] Create BackJoon11723.java MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 백준 11723: 집합 <문제 해결 과정> 백준 11723번은 대량 연산(최대 3,000,000번)을 처리해야 하는 집합 관리 문제로, 초기 ArrayList 접근법에서 시간 초과를 겪었습니다. indexOf 의 O(n) 복잡도가 병목이었고, 특히 all 연산 구현이 어려웠습니다. 이를 해결하기 위해 비트마스크를 도입, 단일 int 로 집합을 관리하며 모든 연산을 O(1) 로 최적화했습니다. 출력은 StringBuilder 로 모아 시간 초과를 방지했습니다. <핵심> - 비트마스크: 집합을 32비트 int로 표현. 비트마스크는 비트 연산이기에 O(1)로 구현 가능. - 효율성: 연산당 O(1) 메모리 4바이트 사용. - 직관: 집합을 20개 스위치로 생각, 비트로 조작. --- .../BackJoon11723.java" | 78 +++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100644 "KHJ_Root/\353\260\261\354\244\200\353\254\270\354\240\234/BackJoon11723.java" diff --git "a/KHJ_Root/\353\260\261\354\244\200\353\254\270\354\240\234/BackJoon11723.java" "b/KHJ_Root/\353\260\261\354\244\200\353\254\270\354\240\234/BackJoon11723.java" new file mode 100644 index 0000000..24223b8 --- /dev/null +++ "b/KHJ_Root/\353\260\261\354\244\200\353\254\270\354\240\234/BackJoon11723.java" @@ -0,0 +1,78 @@ +/* 문제 */ +/* 비어있는 공집합 S가 주어졌을 때, 아래 연산을 수행하는 프로그램을 작성하시오. */ +/* +- add x : S에 x를 추가한다. (1 <= x <= 20) S에 x가 이미 있는 경우에는 연산을 무시한다. +- remove x : S에서 x를 제거한다. (1 <= x <= 20) S에 x가 없는 경우에는 연산을 무시한다. +- check x : S에 x 가 있으면 1을, 없으면 0을 출력한다. (1 <= x <= 20) +- toggle x : S에 x가 있으면 x를 제거하고, 없으면 x를 추가한다. (1 <= x <= 20) +- all : S를 {1, 2, ..., 20}으로 바꾼다 +- empty : S를 공집합으로 바꾼다. + +<입력> +첫째 줄에 수행하는 연산의 수 M (1 <= M <= 3,000,000)이 주어진다. +둘째 줄부터 M개의 줄에 수행해야 하는 연산이 한 줄에 하나씩 주어진다. + +<출력> +check 연산이 주어질때마다, 결괄를 출력한다. +*/ + +/* +<비트마스크 연산> +add: $ x $번째 비트를 1로 (set |= 1 << (x-1)). +remove: $ x $번째 비트를 0으로 (set &= ~(1 << (x-1))). +check: $ x $번째 비트 확인 (set & (1 << (x-1))). +toggle: $ x $번째 비트 반전 (set ^= 1 << (x-1)). +all: 1~20 비트를 1로 (set = (1 << 20) - 1). +empty: 모든 비트를 0으로 (set = 0). +*/ + + +import java.io.*; +import java.util.StringTokenizer; + +public class Main { + public static void main(String[] args) throws IOException { + BufferReader br = new BufferReader(new InputStreamReader(System.in)); + StringBuilder sb = new StringBuilder(); + + int M = Integer.parseInt(br.readLine()); // 연산 수 입력 + int set = 0; // 비트마스크로 집합 표현 (초기 공집합) + + for (int i = 0; i < M; i++) { + StringTokenizer st = new StringTokenizer(br.readLine()); + String operation = st.nextToken(); // 연산 명령어 + int x; + + switch (operation) { + case "add": + x = Integer.parseInt(st.nextToken()); + set |= (1 << (x - 1)); // x 번째 비트를 1로 설정 (추가) + break; + case "remove": + x = Integer.parseInt(st.nextToken()); + set &= ~(1 << (x-1)); // x 번째 비트를 0으로 설정 (제거) + break; + case "check": + x = Integer.parseInt(st.nextToken()); + if ((set & (1 << (x-1))) != 0) { // x번째 비트가 1인지 확인 + sb.append("1\n"); // 있으면 1 추가 + } else { + sb.append("0\n"); // 없으면 0 추가 + } + break; + case "toggle": + x = Integer.parseInt(st.nextToken()); + set ^= (1 << (x-1)); // x번째 비트를 revese + break; + case "all": + set = (1 << 20) - 1; // 1 ~ 20 비트를 모두 1로 설정 + break; + case "empty": + set = 0; // 모든 비트를 0으로 설정 + break; + } + } + System.out.println(sb); + br.close(); + } +} From 1a61738c08dbf1a4849f70f6db56d7e1eafb5b35 Mon Sep 17 00:00:00 2001 From: IAM <83930018+syslians@users.noreply.github.com> Date: Fri, 25 Jul 2025 20:09:38 +0900 Subject: [PATCH 3/4] Set.java --- Set.java | 39 ++++++++++++++++++++++++++++----------- 1 file changed, 28 insertions(+), 11 deletions(-) diff --git a/Set.java b/Set.java index 355e03c..1145dec 100644 --- a/Set.java +++ b/Set.java @@ -1,12 +1,12 @@ import java.io.*; -import java.util; +import java.util.*; public class Main { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringBuilder sb = new StringBuilder(); int M = Integer.parseInt(br.readLine()); // 연산 수 입력 - int set = 0; // 비트마스크로 집합 표현 (초기 공집합) + List set = new ArrayList<>(); // ArrayList로 집합 표현 for (int i = 0; i < M; i++) { StringTokenizer st = new StringTokenizer(br.readLine()); @@ -16,25 +16,42 @@ public static void main(String[] args) throws IOException { switch (operation) { case "add": x = Integer.parseInt(st.nextToken()); - set |= (1 << (x - 1)); // x번째 비트를 1로 설정 (추가) + if (set.indexOf(x) == -1) { // 중복 확인 + set.add(x); // 요소 추가 + } break; case "remove": - /**/ + x = Integer.parseInt(st.nextToken()); + int removeIndex = set.indexOf(x); // 요소 위치 찾기 + if (removeIndex != -1) { // 요소가 있으면 제거 + set.remove(removeIndex); + } + break; case "check": x = Integer.parseInt(st.nextToken()); - if ((set & (1 << (x - 1))) != 0) { // x번째 비트가 1인지 확인 - /**/ - } + if (set.indexOf(x) != -1) { // 요소 존재 확인 + sb.append("1\n"); // 있으면 1 출력 + } else { + sb.append("0\n"); // 없으면 0 출력 + } break; case "toggle": x = Integer.parseInt(st.nextToken()); - set ^= (1 << (x - 1)); // x번째 비트를 반전 + int toggleIndex = set.indexOf(x); // 요소 위치 찾기 + if (toggleIndex == -1) { // 없으면 추가 + set.add(x); + } else { // 있으면 제거 + set.remove(toggleIndex); + } break; case "all": - set = (1 << 20) - 1; // 1~20 비트를 모두 1로 설정 + set.clear(); // 기존 집합 비우기 + for (int j = 1; j <= 20; j++) { // 1~20 추가 + set.add(j); + } break; case "empty": - set = 0; // 모든 비트를 0으로 설정 + set.clear(); // 집합 비우기 break; } } @@ -42,4 +59,4 @@ public static void main(String[] args) throws IOException { System.out.print(sb); // 결과 출력 br.close(); } -} +} \ No newline at end of file From f76735b6affc8d1b64f04740171898d173c42426 Mon Sep 17 00:00:00 2001 From: IAM <83930018+syslians@users.noreply.github.com> Date: Sun, 27 Jul 2025 22:03:44 +0900 Subject: [PATCH 4/4] =?UTF-8?q?Create=20=EB=B0=B1=EC=A4=801761=EB=B2=88(?= =?UTF-8?q?=EC=A0=95=EC=A0=90=EB=93=A4=EC=9D=98=EA=B1=B0=EB=A6=AC).java?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...354\235\230\352\261\260\353\246\254).java" | 82 +++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100644 "KHJ_Root/\353\260\261\354\244\200\353\254\270\354\240\234/\353\260\261\354\244\2001761\353\262\210(\354\240\225\354\240\220\353\223\244\354\235\230\352\261\260\353\246\254).java" diff --git "a/KHJ_Root/\353\260\261\354\244\200\353\254\270\354\240\234/\353\260\261\354\244\2001761\353\262\210(\354\240\225\354\240\220\353\223\244\354\235\230\352\261\260\353\246\254).java" "b/KHJ_Root/\353\260\261\354\244\200\353\254\270\354\240\234/\353\260\261\354\244\2001761\353\262\210(\354\240\225\354\240\220\353\223\244\354\235\230\352\261\260\353\246\254).java" new file mode 100644 index 0000000..7853fea --- /dev/null +++ "b/KHJ_Root/\353\260\261\354\244\200\353\254\270\354\240\234/\353\260\261\354\244\2001761\353\262\210(\354\240\225\354\240\220\353\223\244\354\235\230\352\261\260\353\246\254).java" @@ -0,0 +1,82 @@ +import java.io.*; +import java.util.*; + +class Edge { + int vertex; + int weight; + + Edge(int vertex, int weight) { + this.vertex = vertex; + this.weight = weight; + } +} + +public class Main { + static ArrayList[] graph; + static int N; + + public static void main(String[] args) throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); + + // 정점 수 입력 + N = Integer.parseInt(br.readLine()); + // 인접 리스트 초기화 + graph = new ArrayList[N + 1]; + for (int i = 1; i <= N; i++) { + graph[i] = new ArrayList<>(); + } + + // 간선 정보 입력 (N-1개) + for (int i = 0; i < N - 1; i++) { + StringTokenizer st = new StringTokenizer(br.readLine()); + int a = Integer.parseInt(st.nextToken()); + int b = Integer.parseInt(st.nextToken()); + int w = Integer.parseInt(st.nextToken()); + graph[a].add(new Edge(b, w)); + graph[b].add(new Edge(a, w)); // 무방향 트리 + } + + // 쿼리 수 입력 + int M = Integer.parseInt(br.readLine()); + // 쿼리 처리 + for (int i = 0; i < M; i++) { + StringTokenizer st = new StringTokenizer(br.readLine()); + int u = Integer.parseInt(st.nextToken()); + int v = Integer.parseInt(st.nextToken()); + int distance = bfs(u, v); + bw.write(distance + "\n"); + } + + bw.flush(); + bw.close(); + br.close(); + } + + // BFS로 두 정점 간 거리 계산 + static int bfs(int start, int end) { + int[] dist = new int[N + 1]; + Arrays.fill(dist, -1); // -1: 미방문 + dist[start] = 0; // 시작점 거리 0 + Queue queue = new LinkedList<>(); + queue.add(start); + + while (!queue.isEmpty()) { + int curr = queue.poll(); + if (curr == end) { // 목표 정점 도달 + return dist[curr]; + } + + for (Edge edge : graph[curr]) { + int next = edge.vertex; + int weight = edge.weight; + if (dist[next] == -1) { // 미방문 정점 + dist[next] = dist[curr] + weight; + queue.add(next); + } + } + } + + return -1; // 도달 불가능 (트리이므로 발생하지 않음) + } +}