Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
78 changes: 78 additions & 0 deletions KHJ_Root/백준문제/BackJoon11723.java
Original file line number Diff line number Diff line change
@@ -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();
}
}
82 changes: 82 additions & 0 deletions KHJ_Root/백준문제/백준1761번(정점들의거리).java
Original file line number Diff line number Diff line change
@@ -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<Edge>[] 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<Integer> 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; // 도달 불가능 (트리이므로 발생하지 않음)
}
}
62 changes: 62 additions & 0 deletions Set.java
Original file line number Diff line number Diff line change
@@ -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<Integer> 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();
}
}