Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 8252d54

Browse files
committed
2 parents 3aab10e + 906fd25 commit 8252d54

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

46 files changed

+2767
-11
lines changed

‎BOJ/1000-5000번/DH_1052.java‎

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
import java.io.*;
2+
import java.util.*;
3+
4+
/*
5+
* 물병
6+
*/
7+
8+
public class DH_1052 {
9+
public static void main(String[] args) throws Exception {
10+
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
11+
StringTokenizer st = new StringTokenizer(br.readLine());
12+
13+
int n = Integer.parseInt(st.nextToken());
14+
int k = Integer.parseInt(st.nextToken());
15+
16+
int answer = 0;
17+
18+
while(Integer.bitCount(n) > k) {
19+
answer += 1;
20+
n += 1;
21+
}
22+
23+
System.out.println(answer);
24+
}
25+
}

‎BOJ/1000-5000번/DH_1761.java‎

Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
1+
import java.io.*;
2+
import java.util.*;
3+
4+
/*
5+
* 정점들의 거리
6+
*/
7+
8+
public class DH_1761 {
9+
static class Node {
10+
int e, w;
11+
public Node(int e, int w) {
12+
this.e = e;
13+
this.w = w;
14+
}
15+
}
16+
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
17+
static StringBuilder sb = new StringBuilder();
18+
static StringTokenizer st;
19+
static int N;
20+
static ArrayList<Node> adj[];
21+
static int[] depth, p, dis;
22+
23+
public static void main(String[] args) throws Exception {
24+
initInput();
25+
solution();
26+
}
27+
28+
static void solution() throws Exception {
29+
bfs();
30+
getDis();
31+
}
32+
33+
static void getDis() throws Exception {
34+
int M = Integer.parseInt(br.readLine());
35+
36+
for(int i = 0; i < M; i++) {
37+
st = new StringTokenizer(br.readLine());
38+
39+
int a = Integer.parseInt(st.nextToken());
40+
int b = Integer.parseInt(st.nextToken());
41+
42+
// a, b의 최소공통조상 구하고, 두 점 간 사이 구하기
43+
sb.append(LCA(a, b)).append("\n");
44+
}
45+
46+
System.out.print(sb);
47+
}
48+
49+
static long LCA(int a, int b) {
50+
// result = (루트 ~ a) + (루트 ~ b) - 2 * (루트 ~ 최소공통조상)
51+
long result = dis[a] + dis[b];
52+
53+
int depthA = depth[a];
54+
int depthB = depth[b];
55+
56+
// 무조건 a가 depth가 작도록
57+
if(depthB < depthA) {
58+
int tmp = a;
59+
a = b;
60+
b = tmp;
61+
}
62+
63+
int diffDis = Math.abs(depthA - depthB);
64+
65+
// 깊이 맞추기
66+
for(int i = 0; i < diffDis; i++) b = p[b];
67+
68+
while(a != b) {
69+
a = p[a];
70+
b = p[b];
71+
}
72+
73+
return result - 2 * dis[a];
74+
}
75+
76+
static void bfs() {
77+
boolean[] v = new boolean[N + 1];
78+
79+
Queue<Node> q = new ArrayDeque<>();
80+
q.add(new Node(1, 0));
81+
v[1] = true;
82+
83+
while(!q.isEmpty()) {
84+
Node current = q.poll();
85+
86+
for(Node next: adj[current.e]) {
87+
if(v[next.e]) continue;
88+
p[next.e] = current.e;
89+
depth[next.e] = depth[current.e] + 1;
90+
dis[next.e] = dis[current.e] + next.w;
91+
v[next.e] = true;
92+
q.add(next);
93+
}
94+
}
95+
96+
}
97+
98+
static void initInput() throws Exception {
99+
br = new BufferedReader(new InputStreamReader(System.in));
100+
N = Integer.parseInt(br.readLine());
101+
102+
adj = new ArrayList[N + 1];
103+
depth = new int[N + 1];
104+
dis = new int[N + 1];
105+
p = new int[N + 1];
106+
107+
for(int i = 0; i < adj.length; i++) adj[i] = new ArrayList<>();
108+
109+
for(int i = 0; i < N - 1; i++) {
110+
st = new StringTokenizer(br.readLine());
111+
112+
int s = Integer.parseInt(st.nextToken());
113+
int e = Integer.parseInt(st.nextToken());
114+
int w = Integer.parseInt(st.nextToken());
115+
adj[s].add(new Node(e, w));
116+
adj[e].add(new Node(s, w));
117+
}
118+
}
119+
}

‎BOJ/1000-5000번/HW_1052.java‎

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
import java.io.*;
2+
import java.util.*;
3+
4+
// 시간복잡도 : Integer.bitCount O(log N) * K 물병 개수
5+
// 상점에서 사야하는 물병의 최솟값
6+
public class HW_1052 {
7+
public static void main(String[] args) throws IOException {
8+
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
9+
StringTokenizer st = new StringTokenizer(br.readLine());
10+
int N = Integer.parseInt(st.nextToken());
11+
int K = Integer.parseInt(st.nextToken());
12+
13+
int ans = 0;
14+
15+
while(true) {
16+
int cnt = Integer.bitCount(N); // 2^n 리터 단위로 병 합칠 수 있음
17+
18+
if(cnt<=K) { // K개를 넘으면 멈춤
19+
break;
20+
}
21+
N++; // 물병 사기
22+
ans++; //
23+
}
24+
System.out.println(ans);
25+
}
26+
}

‎BOJ/1000-5000번/HW_1761.java‎

Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
import java.io.*;
2+
import java.util.*;
3+
4+
// 시간 복잡도 : O(N + M logN)
5+
public class HW_1761 {
6+
static int N, M, maxDepth;
7+
static List<int[]>[] tree;
8+
static int[] depth; // 깊이 저장
9+
static int[][] parent; // 부모 노드 저장
10+
static int[] dist; // 거리 저장
11+
public static void main(String[] args) throws IOException {
12+
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
13+
StringTokenizer st;
14+
15+
N = Integer.parseInt(br.readLine());
16+
maxDepth = (int) (Math.log(N) / Math.log(2)) + 1;
17+
18+
// 트리 초기화
19+
tree = new ArrayList[N+1];
20+
for(int i=1; i<=N; i++) {
21+
tree[i] = new ArrayList<>();
22+
}
23+
24+
// 간선 정보 입력
25+
for(int i=0; i<N-1; i++) {
26+
st = new StringTokenizer(br.readLine());
27+
int u = Integer.parseInt(st.nextToken());
28+
int v = Integer.parseInt(st.nextToken());
29+
int w = Integer.parseInt(st.nextToken()); // 거리
30+
tree[u].add(new int[] {v, w});
31+
tree[v].add(new int[] {u, w});
32+
}
33+
34+
depth = new int[N+1];
35+
dist = new int[N+1];
36+
parent = new int[N+1][maxDepth];
37+
Arrays.fill(depth, -1);
38+
39+
// DFS
40+
depth[1] = 0;
41+
dfs(1, 0);
42+
43+
// 부모 테이블
44+
for(int d=1; d<maxDepth; d++) {
45+
for(int i=1; i<=N; i++) {
46+
if(parent[i][d-1] != 0) { // 이전 단계에 부모가 존재할 경우
47+
parent[i][d] = parent[parent[i][d-1]][d-1];
48+
}
49+
}
50+
}
51+
52+
M = Integer.parseInt(br.readLine());
53+
54+
// 공통 조상 구하기
55+
for(int i=0; i<M; i++) {
56+
st = new StringTokenizer(br.readLine());
57+
int u = Integer.parseInt(st.nextToken());
58+
int v = Integer.parseInt(st.nextToken());
59+
int lca = LCA(u, v);
60+
int distance = dist[u] + dist[v] - 2 * dist[lca];
61+
62+
System.out.println(distance);
63+
}
64+
}
65+
static void dfs(int node, int d) {
66+
for(int[] edge: tree[node]) {
67+
int next = edge[0];
68+
int weight = edge[1];
69+
70+
if(depth[next] == -1) { // 방문하지 않은 노드라면
71+
depth[next] = depth[node] + 1; // 깊이 설정
72+
dist[next] = dist[node] + weight; // 루트에서 거리 계산
73+
parent[next][0] = node; // 바로 위 부모 노드 설정
74+
dfs(next, d+1); // 다음 노드 탐색
75+
}
76+
}
77+
}
78+
79+
static int LCA(int u, int v) {
80+
if(depth[u] < depth[v]) {
81+
int temp = u;
82+
u = v;
83+
v = temp;
84+
}
85+
86+
// 깊이를 맞추기
87+
for(int i=maxDepth-1; i>=0; i--) {
88+
if(depth[u] - (1<<i) >= depth[v]) {
89+
u = parent[u][i];
90+
}
91+
}
92+
93+
// 공통 조상 찾기
94+
if(u==v)
95+
return u;
96+
97+
// 같은 조상이 나올 때까지 한 칸씩 올리기
98+
for(int i=maxDepth-1; i>=0; i--) {
99+
if(parent[u][i] != parent[v][i]){
100+
u = parent[u][i];
101+
v = parent[v][i];
102+
}
103+
}
104+
return parent[u][0];
105+
}
106+
}

‎BOJ/1000-5000번/JW_1052.java‎

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import java.io.BufferedReader;
2+
import java.io.InputStreamReader;
3+
import java.util.StringTokenizer;
4+
5+
public class JW_1052 {
6+
7+
public static void main(String[] args) throws Exception {
8+
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
9+
StringTokenizer st = new StringTokenizer(br.readLine());
10+
int n = Integer.parseInt(st.nextToken());
11+
int k = Integer.parseInt(st.nextToken());
12+
int cnt = 0;
13+
// k개로 옮기지 못하는 경우
14+
// 2개씩 합쳐서 옮길 수 없는 경우 즉, 2^m의 조합의 수 > k
15+
while (Integer.bitCount(n) > k) {
16+
// 최소한의 수를 더하여 비트 줄이기
17+
cnt += Integer.lowestOneBit(n);
18+
n += Integer.lowestOneBit(n);
19+
}
20+
System.out.println(cnt);
21+
}
22+
}

‎BOJ/1000-5000번/JW_1761.java‎

Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
import java.util.ArrayDeque;
2+
import java.util.ArrayList;
3+
import java.util.Deque;
4+
5+
public class JW_1761 {
6+
7+
static int n;
8+
static ArrayList<ArrayList<Node>> tree = new ArrayList<>();
9+
static int[] depth, dist;
10+
static int[] parent;
11+
12+
static class Node {
13+
int v;
14+
int w;
15+
16+
Node(int v, int w) {
17+
this.v = v;
18+
this.w = w;
19+
}
20+
}
21+
22+
public static void main(String[] args) throws Exception {
23+
n = read();
24+
parent = new int[n + 1];
25+
depth = new int[n + 1];
26+
dist = new int[n + 1];
27+
for (int i = 0; i < n + 1; i++)
28+
tree.add(new ArrayList<>());
29+
for (int i = 0; i < n - 1; i++) {
30+
int u = read(), v = read(), w = read();
31+
tree.get(u).add(new Node(v, w));
32+
tree.get(v).add(new Node(u, w));
33+
}
34+
bfs();
35+
StringBuilder sb = new StringBuilder();
36+
int t = read();
37+
while (t-- > 0) {
38+
int a = read(), b = read();
39+
sb.append(LCA(a, b)).append("\n");
40+
}
41+
System.out.println(sb);
42+
}
43+
44+
static void bfs() {
45+
boolean[] visited = new boolean[n + 1];
46+
Deque<Node> dq = new ArrayDeque<>();
47+
dq.offer(new Node(1, 0));
48+
visited[1] = true;
49+
while (!dq.isEmpty()) {
50+
Node cur = dq.poll();
51+
for (Node next : tree.get(cur.v)) {
52+
if (visited[next.v])
53+
continue;
54+
parent[next.v] = cur.v;
55+
depth[next.v] = depth[cur.v] + 1;
56+
dist[next.v] = dist[cur.v] + next.w;
57+
visited[next.v] = true;
58+
dq.offer(next);
59+
}
60+
}
61+
}
62+
63+
static long LCA(int a, int b) {
64+
long result = dist[a] + dist[b];
65+
int depthA = depth[a];
66+
int depthB = depth[b];
67+
68+
if (depthB < depthA) {
69+
int tmp = a;
70+
a = b;
71+
b = tmp;
72+
}
73+
74+
int diff = Math.abs(depthA - depthB);
75+
for (int i = 0; i < diff; i++)
76+
b = parent[b];
77+
78+
while (a != b) {
79+
a = parent[a];
80+
b = parent[b];
81+
}
82+
return result - 2 * dist[a];
83+
}
84+
85+
private static int read() throws Exception {
86+
int c, n = System.in.read() & 15;
87+
while ((c = System.in.read()) >= 48)
88+
n = (n << 3) + (n << 1) + (c & 15);
89+
if (c == 13)
90+
System.in.read();
91+
return n;
92+
}
93+
}

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /