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
93 changes: 93 additions & 0 deletions WEEK14/BOJ_14466/jiseung.java
Original file line number Diff line number Diff line change
@@ -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<Integer> 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<int[]> 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();
}
}
75 changes: 75 additions & 0 deletions WEEK14/BOJ_19535/jiseung.java
Original file line number Diff line number Diff line change
@@ -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<Integer>[] 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<int[]> q = new ArrayDeque<>();
q.add(new int[]{0, 1});
boolean[] visited = new boolean[n];
int[] parents = new int[n];
List<Integer>[] 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();
}
}
41 changes: 41 additions & 0 deletions WEEK14/BOJ_20366/jiseung.java
Original file line number Diff line number Diff line change
@@ -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();
}
}
55 changes: 55 additions & 0 deletions WEEK14/BOJ_23326/jiseung.java
Original file line number Diff line number Diff line change
@@ -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<Integer> 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();
}
}