diff --git "a/BOJ/10001-15000353円262円210円/JY_12784.java" "b/BOJ/10001-15000353円262円210円/JY_12784.java" new file mode 100644 index 00000000..b21b2765 --- /dev/null +++ "b/BOJ/10001-15000353円262円210円/JY_12784.java" @@ -0,0 +1,71 @@ +import java.io.*; +import java.util.*; +public class JY_12784 { + + static int N, M; + static List[] g; + static boolean[] visited; + static class Node { + int num, cost; + public Node(int num, int cost) { + this.num = num; + this.cost = cost; + } + @Override + public String toString() { + return "Node [num=" + num + ", cost=" + cost + "]"; + } + + + } + + public static void main(String[] args) throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + StringTokenizer st = new StringTokenizer(br.readLine()); + + int T = Integer.parseInt(st.nextToken()); + StringBuilder sb = new StringBuilder(); + for(int t=0; t(); + } + + for(int i=0; i 자식 순회 + int minCost = 0; + for(Node next: g[now]) { + if(visited[next.num]) continue; + minCost += Math.min(next.cost, dfs(next.num)); + } + + return minCost; + } + +} \ No newline at end of file diff --git "a/BOJ/30000-35000353円262円210円/JY_32070.java" "b/BOJ/30000-35000353円262円210円/JY_32070.java" new file mode 100644 index 00000000..97acb3d9 --- /dev/null +++ "b/BOJ/30000-35000353円262円210円/JY_32070.java" @@ -0,0 +1,120 @@ +import java.io.*; +import java.util.*; + +public class JY_32070 { + static int N; + // cnt[i] 그룹의 공의 개수 == 그룹의 크기 + // rank[i] 트리의 깊이 + // toParis[] 한 그룹에서 상단에 위치한 공의 개수 + static int[] parent, cnt, topPairs; + static boolean[] solved; + static List[] ball; + + static int find(int u) { + if (parent[u] == u) return u; + return parent[u] = find(parent[u]); + } + + static void union(int a, int b) { + int pa = find(a); + int pb = find(b); + + if(pa == pb) return; + if(pa < pb) { + parent[pb] = pa; + cnt[pa] += cnt[pb]; + } else { + parent[pa] = pb; + cnt[pb] += cnt[pa]; + } + + } + + // 해당 집합의 크기 반환 + static int getCnt(int u) { + return cnt[find(u)]; + } + + public static void main(String[] args) throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + N = Integer.parseInt(br.readLine()); + + ball = new ArrayList[N + 1]; + for (int i = 1; i <= N; i++) { + ball[i] = new ArrayList(); + } + + parent = new int[N + 1]; +// rank = new int[N + 1]; + cnt = new int[N + 1]; + topPairs = new int[N + 1]; + solved = new boolean[N + 1]; + + // 초기화 == 각 상자가 그룹장 + for (int i = 1; i <= N; i++) { + parent[i] = i; + cnt[i] = 1; + } + + for (int i = 1; i <= N; i++) { + StringTokenizer st = new StringTokenizer(br.readLine()); + int a = Integer.parseInt(st.nextToken()); + int b = Integer.parseInt(st.nextToken()); + + // 색깔이 a인 공의 절대적인 상자 위치 + ball[a].add(i * 2); + // 색깔이 b인 공의 절대적인 상자 위치 + ball[b].add(i * 2 + 1); + } + + System.out.println(Arrays.toString(ball)); + + // 같은 색 공이 있는 상자들을 병합 + for (int i = 1; i <= N; i++) { + union(ball[i].get(0) / 2, ball[i].get(1) / 2); + } + + System.out.println(">> parent: "+Arrays.toString(parent)); + System.out.println(">> cnt: "+Arrays.toString(cnt)); + // cnt[i] : i번째 상자가 속한 사이클의 상자의 개수 + + // 루트 노드의 topPairs 개수 증가 + // 짝수 : 상자의 상단에 있음 + // 홀수 : 상자의 하단에 있음 + for (int i = 1; i <= N; i++) { + // 색깔이 i인 공이 모두 각 상자의 상단에 있음 + if (ball[i].get(0) % 2 == 0 && ball[i].get(1) % 2 == 0) { + int rootIdx = find(ball[i].get(0) / 2); + System.out.println("i:"+i+" root:"+rootIdx); + topPairs[rootIdx]++; + } + } + + System.out.println("top: "+Arrays.toString(topPairs)); + + // 상자 그룹이 2개 이상이면 불가능 (-1 출력) + for (int i = 1; i <= N; i++) { + int rootIdx = find(ball[i].get(0) / 2); + if (topPairs[rootIdx]>= 2) { + System.out.println("-1"); + return; + } + } + + int ans = 0; + + // 최소 이동 횟수 계산 + for (int i = 1; i <= N; i++) { + int rootIdx = find(ball[i].get(0) / 2); + + if (solved[rootIdx]) continue; + + solved[rootIdx] = true; + int x = cnt[rootIdx]; + + if (x>= 2) ans += x + 1; + } + + System.out.println(ans); + } +} diff --git "a/BOJ/5001-10000353円262円210円/JY_9944.java" "b/BOJ/5001-10000353円262円210円/JY_9944.java" new file mode 100644 index 00000000..63301897 --- /dev/null +++ "b/BOJ/5001-10000353円262円210円/JY_9944.java" @@ -0,0 +1,113 @@ +import java.util.*; +import java.io.*; +public class JY_9944 { + + static final int INF = 1000001; + static int N, M; + static char[][] g; + // 상 하 좌 우 + static int[] dx = {-1, 1, 0, 0}; + static int[] dy = {0, 0, -1, 1}; + static boolean[][] visited; + static int eCnt = 0; + static int ans; + + public static void main(String[] args) throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + StringTokenizer st; + String line; + + int t = 1; + while((line = br.readLine()) != null && !line.isEmpty()) { + st = new StringTokenizer(line); + + N = Integer.parseInt(st.nextToken()); + M = Integer.parseInt(st.nextToken()); + + g = new char[N][M]; + eCnt = 0; + for(int i=0; i=0 && x=0 && y= ans || cnt>= INF) return; + + visited[x][y] = true; + int nx = x + dx[dir]; + int ny = y + dy[dir]; + + // 현재 방향으로 갈 수 있음 + if(canGo(nx, ny)) { + dfs(nx, ny, dir, mCnt+1, cnt); + } + // 갈 수 없음 -> 방햔 전환 필요(단계 증가) + else { + boolean isMove = false; + for(int i=0; i<4; i++) { + if(i == dir) continue; + nx = x + dx[i]; + ny = y + dy[i]; + if(!canGo(nx, ny)) continue; + + isMove = true; + dfs(nx, ny, i, mCnt+1, cnt+1); + } + + } + visited[x][y] = false; + } + +} diff --git "a/CodeTree/2021-2022353円205円204円/JY_Sam354円235円230円_355円224円274円354円236円220円355円225円231円352円265円220円.java" "b/CodeTree/2021-2022353円205円204円/JY_Sam354円235円230円_355円224円274円354円236円220円355円225円231円352円265円220円.java" new file mode 100644 index 00000000..e13bb7c2 --- /dev/null +++ "b/CodeTree/2021-2022353円205円204円/JY_Sam354円235円230円_355円224円274円354円236円220円355円225円231円352円265円220円.java" @@ -0,0 +1,214 @@ +import java.io.*; +import java.util.*; +public class JY_Sam의_피자학교 { + + static int N, K; + static int MX, MY, D; + static int[] arr; + static int[][] g; + // 상 우 하 좌 + static int[] dx = {-1, 0, 1, 0}; + static int[] dy = {0, 1, 0, -1}; + + public static void main(String[] args) throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + StringTokenizer st = new StringTokenizer(br.readLine()); + + N = Integer.parseInt(st.nextToken()); + K = Integer.parseInt(st.nextToken()); + + st = new StringTokenizer(br.readLine()); + arr = new int[N]; + for(int i=0; i bottom) { + isStop = true; + break; + } + MX = i; + MY = j; + } + } + D = Math.max(N - (MX*MY), MX+1); + + } + public static void inputWheat() { + int minW = Integer.MAX_VALUE; + for(int i=0; i=0 && x=0 && y=0; i--) { + g[x][y] = arr[i]; + + // 다음 위치 + int nx = x+dx[dir]; + int ny = y+dy[dir]; + // 방향을 바꿔야 함 + if(!inRange(nx, ny, MX, MY) || g[nx][ny] != 0) { + dir = (dir+1)%4; + nx = x+dx[dir]; + ny = y+dy[dir]; + } + x = nx; + y = ny; + } + + // 나머지 바닥 도우 넣기 + x = MX; + y = 0; + for(int i=MX*MY; i g[nx][ny]) tmp[i][j] -= div; + else tmp[i][j] += div; + } + } + } + + for(int i=0; i=0; i--) { + if(g[i][j] == 0) continue; + trr[idx] = g[i][j]; + idx++; + } + } + + arr = trr; + } + public static void halfDough() { + int S = N / 4; + int dir = 1; // 우 -> + + int M = Math.max(S, 4); + g = new int[M][M]; + + // 맨 아래층 + int x = 3; + int y = 0; + for(int i=N-S; i= n) return -1; + return answer; + } + public static int dfs(int[][] info, int i, int j) { + // B가 훔친 것이 M이상이면 불가능 stop + if(j>= M) return INF; + // 모든 물건 탐색 -> 더이상 탐색할 물건 없음 + if(i == info.length) return 0; + + // 이미 i번쨰 물건을 B가 훔쳤음(== 이미 최솟값 갱신됨) + if(dp[i][j] != -1) return dp[i][j]; + + + int a = info[i][0]; + int b = info[i][1]; + + // A가 훔치는 경우 + int ca = dfs(info, i+1, j) + a; + // B가 훔치는 경우 + int cb = dfs(info, i+1, j+b); + + return dp[i][j] = Math.min(ca, cb); + } +} \ No newline at end of file diff --git "a/SQL/25354円243円274円354円260円250円/JY_355円227円244円353円271円204円_354円234円240円354円240円200円352円260円200円_354円206円214円354円234円240円355円225円234円_354円236円245円354円206円214円.sql" "b/SQL/25354円243円274円354円260円250円/JY_355円227円244円353円271円204円_354円234円240円354円240円200円352円260円200円_354円206円214円354円234円240円355円225円234円_354円236円245円354円206円214円.sql" new file mode 100644 index 00000000..4a7c109d --- /dev/null +++ "b/SQL/25354円243円274円354円260円250円/JY_355円227円244円353円271円204円_354円234円240円354円240円200円352円260円200円_354円206円214円354円234円240円355円225円234円_354円236円245円354円206円214円.sql" @@ -0,0 +1,8 @@ +-- 헤비 유저가 소유한 장소 +-- https://school.programmers.co.kr/learn/courses/30/lessons/77487 + +SELECT +* +FROM PLACES +WHERE HOST_ID IN (SELECT HOST_ID FROM PLACES GROUP BY HOST_ID HAVING COUNT(ID)>=2) +ORDER BY ID \ No newline at end of file

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