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(); + } +} 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; // 도달 불가능 (트리이므로 발생하지 않음) + } +} diff --git a/Set.java b/Set.java new file mode 100644 index 0000000..1145dec --- /dev/null +++ b/Set.java @@ -0,0 +1,62 @@ +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()); // 연산 수 입력 + List set = new ArrayList<>(); // ArrayList로 집합 표현 + + 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()); + 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.indexOf(x) != -1) { // 요소 존재 확인 + sb.append("1\n"); // 있으면 1 출력 + } else { + sb.append("0\n"); // 없으면 0 출력 + } + break; + case "toggle": + x = Integer.parseInt(st.nextToken()); + int toggleIndex = set.indexOf(x); // 요소 위치 찾기 + if (toggleIndex == -1) { // 없으면 추가 + set.add(x); + } else { // 있으면 제거 + set.remove(toggleIndex); + } + break; + case "all": + set.clear(); // 기존 집합 비우기 + for (int j = 1; j <= 20; j++) { // 1~20 추가 + set.add(j); + } + break; + case "empty": + set.clear(); // 집합 비우기 + break; + } + } + + System.out.print(sb); // 결과 출력 + br.close(); + } +} \ No newline at end of file