diff --git a/WEEK14/BOJ_14466/jiseung.java b/WEEK14/BOJ_14466/jiseung.java new file mode 100644 index 0000000..545cfc0 --- /dev/null +++ b/WEEK14/BOJ_14466/jiseung.java @@ -0,0 +1,93 @@ +import java.io.*; +import java.util.*; + +public class Main { + + public static void main(String[] args) throws Exception { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); + StringTokenizer st = new StringTokenizer(br.readLine()); + int n = Integer.parseInt(st.nextToken()); + int k = Integer.parseInt(st.nextToken()); + int r = Integer.parseInt(st.nextToken()); + + int[] dr = {-1, 0, 1, 0}; + int[] dc = {0, -1, 0, 1}; + + boolean[][][] roads = new boolean[n][n][4]; + for (int i = 0; i < r; i++) { + st = new StringTokenizer(br.readLine()); + int r1 = Integer.parseInt(st.nextToken()) - 1; + int c1 = Integer.parseInt(st.nextToken()) - 1; + int r2 = Integer.parseInt(st.nextToken()) - 1; + int c2 = Integer.parseInt(st.nextToken()) - 1; + + if (r1 - r2 == 1) { + roads[r1][c1][0] = true; + roads[r2][c2][2] = true; + } else if (r2 - r1 == 1) { + roads[r1][c1][2] = true; + roads[r2][c2][0] = true; + } else if (c1 - c2 == 1) { + roads[r1][c1][1] = true; + roads[r2][c2][3] = true; + } else { + roads[r1][c1][3] = true; + roads[r2][c2][1] = true; + } + } + + boolean[][] cows = new boolean[n][n]; + for (int i = 0; i < k; i++) { + st = new StringTokenizer(br.readLine()); + cows[Integer.parseInt(st.nextToken()) - 1][Integer.parseInt(st.nextToken()) - 1] = true; + } + + List cowCounts = new ArrayList<>(); + boolean[][] visited = new boolean[n][n]; + for (int i = 0; i < n; i++) { + for (int j = 0; j < n; j++) { + if (visited[i][j]) { + continue; + } + int cowCount = 0; + Queue q = new ArrayDeque<>(); + q.add(new int[]{i, j}); + while (!q.isEmpty()) { + int x = q.peek()[0]; + int y = q.poll()[1]; + if (visited[x][y]) { + continue; + } + visited[x][y] = true; + if (cows[x][y]) { + cowCount++; + } + for (int l = 0; l < 4; l++) { + if (roads[x][y][l]) { + continue; + } + int newx = x + dr[l]; + int newy = y + dc[l]; + if (newx < 0 || newx >= n || newy < 0 || newy >= n) { + continue; + } + q.add(new int[]{newx, newy}); + } + } + cowCounts.add(cowCount); + } + } + + int answer = 0; + for (int i = 0; i < cowCounts.size(); i++) { + for (int j = i + 1; j < cowCounts.size(); j++) { + answer += cowCounts.get(i) * cowCounts.get(j); + } + } + bw.write(answer + "\n"); + bw.flush(); + bw.close(); + br.close(); + } +} \ No newline at end of file diff --git a/WEEK14/BOJ_19535/jiseung.java b/WEEK14/BOJ_19535/jiseung.java new file mode 100644 index 0000000..f7bda30 --- /dev/null +++ b/WEEK14/BOJ_19535/jiseung.java @@ -0,0 +1,75 @@ +import java.io.*; +import java.util.*; + +public class Main { + + public static void main(String[] args) throws Exception { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); + int n = Integer.parseInt(br.readLine()); + List[] adj = new ArrayList[n]; + for (int i = 0; i < n; i++) { + adj[i] = new ArrayList<>(); + } + for (int i = 0; i < n - 1; i++) { + StringTokenizer st = new StringTokenizer(br.readLine()); + int a = Integer.parseInt(st.nextToken()) - 1; + int b = Integer.parseInt(st.nextToken()) - 1; + adj[a].add(b); + adj[b].add(a); + } + + long g = 0L; + Queue q = new ArrayDeque<>(); + q.add(new int[]{0, 1}); + boolean[] visited = new boolean[n]; + int[] parents = new int[n]; + List[] childrens = new ArrayList[n]; + for (int i = 0; i < n; i++) { + childrens[i] = new ArrayList<>(); + } + while (!q.isEmpty()) { + int cur = q.peek()[0]; + int dist = q.poll()[1]; + visited[cur] = true; + int children = adj[cur].size(); + if (children >= 3) { + g += (long) children * (children-1) * (children-2) / 6; + } + for (int next : adj[cur]) { + if (visited[next]) { + continue; + } + childrens[cur].add(next); + parents[next] = cur; + q.add(new int[]{next, dist + 1}); + } + } + + long d = 0L; + q.add(new int[]{0, 1}); + Arrays.fill(visited, false); + while (!q.isEmpty()) { + int cur = q.peek()[0]; + int dist = q.poll()[1]; + if (dist >= 3) { + d += childrens[parents[parents[cur]]].size() - 1; + } + if (dist >= 4) { + d++; + } + visited[cur] = true; + for (int next : adj[cur]) { + if (visited[next]) { + continue; + } + q.add(new int[]{next, dist + 1}); + } + } + + bw.write(d==g*3 ? "DUDUDUNGA" : (d>g*3 ? "D" : "G")); + bw.flush(); + bw.close(); + br.close(); + } +} \ No newline at end of file diff --git a/WEEK14/BOJ_20366/jiseung.java b/WEEK14/BOJ_20366/jiseung.java new file mode 100644 index 0000000..4b683c3 --- /dev/null +++ b/WEEK14/BOJ_20366/jiseung.java @@ -0,0 +1,41 @@ +import java.io.*; +import java.util.*; + +public class Main { + + public static void main(String[] args) throws Exception { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); + int n = Integer.parseInt(br.readLine()); + int[] nums = new int[n]; + StringTokenizer st = new StringTokenizer(br.readLine()); + for (int i = 0; i < n; i++) { + nums[i] = Integer.parseInt(st.nextToken()); + } + Arrays.sort(nums); // 지름 정렬 + + int[][] sums = new int[n*(n-1)/2][2]; + int index = 0; + for (int i = 0; i < n; i++) { + for (int j = i + 1; j < n; j++) { + sums[index++] = new int[]{nums[i] + nums[j], i, j}; // 지름의합, 지름1의 인덱스, 지름2의 인덱스 + } + } + Arrays.sort(sums, Comparator.comparingInt(o -> o[0])); // 지름의 합 기준으로 정렬 + int answer = Integer.MAX_VALUE; // 차이의 최솟값 + for (int i = 1; i < sums.length; i++) { + int diff = sums[i][0] - sums[i - 1][0]; // 정렬된 연속된 지름의 합들의 차이 + if (diff >= answer) { // 최솟값보다 크면 건너뜀 + continue; + } + if (sums[i][1] != sums[i-1][1] && sums[i][1] != sums[i-1][2] && sums[i][2] != sums[i-1][1] && sums[i][2] != sums[i-1][2]) { // 선택된 4개의 눈덩이가 서로 다름 + answer = diff; + } + } + + bw.write(answer + "\n"); + bw.flush(); + bw.close(); + br.close(); + } +} \ No newline at end of file diff --git a/WEEK14/BOJ_23326/jiseung.java b/WEEK14/BOJ_23326/jiseung.java new file mode 100644 index 0000000..780d3a9 --- /dev/null +++ b/WEEK14/BOJ_23326/jiseung.java @@ -0,0 +1,55 @@ +import java.io.*; +import java.util.*; + +public class Main { + + public static void main(String[] args) throws Exception { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); + StringTokenizer st = new StringTokenizer(br.readLine()); + int n = Integer.parseInt(st.nextToken()); + int q = Integer.parseInt(st.nextToken()); + + TreeSet sights = new TreeSet<>(); // 명소들을 저장하는 트리셋 + st = new StringTokenizer(br.readLine()); + for (int i = 0; i < n; i++) { + if (st.nextToken().equals("1")) { // 명소면 인덱스를 셋에 추가 + sights.add(i); + } + } + + int location = 0; + while (q-- > 0) { + st = new StringTokenizer(br.readLine()); + int type = Integer.parseInt(st.nextToken()); + if (type == 1) { // 명소 지정, 명소 해제 + int i = Integer.parseInt(st.nextToken()) - 1; + if (sights.contains(i)) { + sights.remove(i); + } else { + sights.add(i); + } + } else if (type == 2) { // 이동 + int x = Integer.parseInt(st.nextToken()); + location += x; + location %= n; + } else { // 명소와의 거리 구하기 + if (sights.isEmpty()) { // 명소가 없으면 + bw.write("-1\n"); + } else if (sights.contains(location)) { // 도현이가 있는 장소가 명소일 때 + bw.write("0\n"); + } else { + Integer sight = sights.higher(location); + if (sight == null) { // 도현이가 있는 위치부터 n번 구역까지 명소가 없음 + bw.write((sights.first()+n-location) + "\n"); + } else { + bw.write((sight-location) + "\n"); + } + } + } + } + bw.flush(); + bw.close(); + br.close(); + } +} \ No newline at end of file