diff --git "a/BOJ/1000-5000353円262円210円/SB_1030.java" "b/BOJ/1000-5000353円262円210円/SB_1030.java" new file mode 100644 index 00000000..f271556a --- /dev/null +++ "b/BOJ/1000-5000353円262円210円/SB_1030.java" @@ -0,0 +1,63 @@ +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.StringTokenizer; + +public class SB_1030 { + static int s, N, K, r1, r2, c1, c2; + static char[][] ans; + + private static void recursive(int x, int y, int t, int color) { // 현재 재귀에서 행, 열, 시간, 색 + int p = (int) Math.pow(N, s - t); // 현재 시간에서 평면 크기 (현재 단계에서 한 격자가 차지하는 실제 크기) + if (!isValid(x*p, x*p+p-1, y*p, y*p+p-1)) return; + + if (t == s) { // 종료조건에서 색 기록 + ans[x - r1][y - c1] = (char) (color + '0'); // x,y좌표를 출력범위에 맞게 조정 후 값 넣기 + return; + } + + for (int i = 0; i < N; i++) { // 현재 격자 N*N으로 분열하기 (i,j는 나뉜 하위 격자내 상대좌표) + for (int j = 0; j < N; j++) { + int nColor; + if (color==1) nColor = 1; + else nColor = (isBlackArea(i) && isBlackArea(j)) ? 1 : 0; + recursive(x * N + i, y * N + j, t + 1, nColor); // 하위 좌표값을 전체 큰 사각형에서 본 절대좌표 값으로 변환해 보냄 + } + } + } + + private static boolean isBlackArea(int i) { // 현재 격자가 검정인지 판단 (i: 현재 행의 인덱스, ((N - K) / 2): 중앙의 검정 구역 시작점) + return !((i < (N - K) / 2) || (((N - 1 - i) < (N - K) / 2))); // 행(i)을 기준으로 해당 행i가 검정구역 위, 아래 존재하는지 판단 + } + + private static boolean isValid(int tr1, int tr2, int tc1, int tc2) { // 탐색범위가 출력범위에 포함되는지 확인 + if (tr1> r2 || tr2 < r1) return false; + if (tc1> c2 || tc2 < c1) return false; + return true; + } + public static void main(String[] args) throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + StringTokenizer st = new StringTokenizer(br.readLine()); + StringBuilder sb = new StringBuilder(); + + s = Integer.parseInt(st.nextToken()); + N = Integer.parseInt(st.nextToken()); + K = Integer.parseInt(st.nextToken()); + r1 = Integer.parseInt(st.nextToken()); + r2 = Integer.parseInt(st.nextToken()); + c1 = Integer.parseInt(st.nextToken()); + c2 = Integer.parseInt(st.nextToken()); + + int row = r2 - r1 + 1; + int col = c2 - c1 + 1; + ans = new char[row][col]; + + // 가장 큰 사각형에서 재귀로 분할해 작은 사각형으로 처리하기 + recursive(0, 0, 0, 0); + + for (char[] c : ans) { + sb.append(c).append('\n'); + } + System.out.println(sb); + } +} diff --git "a/BOJ/1000-5000353円262円210円/SB_1725.java" "b/BOJ/1000-5000353円262円210円/SB_1725.java" new file mode 100644 index 00000000..44affecd --- /dev/null +++ "b/BOJ/1000-5000353円262円210円/SB_1725.java" @@ -0,0 +1,34 @@ +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.ArrayDeque; +import java.util.Deque; + +// pop한 값의 높이를 최소로하는 사각형 만들기 +public class SB_1725 { + public static void main(String[] args) throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + + int N = Integer.parseInt(br.readLine()); + int[] arr = new int[N + 2]; // 인덱스 1부터 시작, 마지막 막대 0추가 + + for (int i = 1; i <= N; i++) { + arr[i] = Integer.parseInt(br.readLine()); + } + + Deque stack = new ArrayDeque(); + stack.push(0); // 0값 먼저 넣어주기 + + long mx = 0; + for (int i = 1; i <= N + 1; i++) { + while (!stack.isEmpty() && arr[stack.peek()]> arr[i]) { // push할 막대가 스택의 값보다 작다면, pop하면서 사각형 넓이 계산 (스택은 항상 오름차순으로 유지) + int idx = stack.pop(); + int h = arr[idx]; // 높이 + int w = stack.isEmpty() ? i - 1 : i - stack.peek() - 1; // 넓이 + mx = Math.max(mx, (long) h *w); + } + stack.push(i); + } + System.out.println(mx); + } +} diff --git "a/BOJ/1000-5000353円262円210円/SB_1992.java" "b/BOJ/1000-5000353円262円210円/SB_1992.java" new file mode 100644 index 00000000..01b1b13f --- /dev/null +++ "b/BOJ/1000-5000353円262円210円/SB_1992.java" @@ -0,0 +1,47 @@ +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; + +public class SB_1992 { + static int N; + static int[][] board; + + private static boolean check(int n, int sx, int sy) { + int num = board[sx][sy]; + for (int i = sx; i < sx+n; i++) { + for (int j = sy; j < sy+n; j++) { + if ((num!=board[i][j])) return false; + } + } + return true; + } + + private static StringBuilder dfs(int n, int sx, int sy, StringBuilder sb) { + // 해당 영역이 모두 같은 숫자면 바로 리턴 + if (check(n, sx, sy)) return sb.append(board[sx][sy]); + + // 아니면 분할 + sb.append('('); + int half = n>> 1; + dfs(half, sx, sy, sb); + dfs(half, sx, sy + half, sb); + dfs(half, sx + half, sy, sb); + dfs(half, sx + half, sy + half, sb); + + return sb.append(')'); + } + public static void main(String[] args) throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + N = Integer.parseInt(br.readLine()); + + board = new int[N][N]; + for (int i = 0; i < N; i++) { + String line = br.readLine(); + for (int j = 0; j < N; j++) { + board[i][j] = line.charAt(j) - '0'; + } + } + + System.out.println(dfs(N, 0, 0, new StringBuilder())); + } +} diff --git "a/BOJ/1000-5000353円262円210円/SB_4803.java" "b/BOJ/1000-5000353円262円210円/SB_4803.java" new file mode 100644 index 00000000..05fe2b68 --- /dev/null +++ "b/BOJ/1000-5000353円262円210円/SB_4803.java" @@ -0,0 +1,76 @@ +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.StringTokenizer; + +public class SB_4803 { + static int[] parent; + static boolean[] isCycle; + static String cnt0 = "No trees."; + static String cnt1 = "There is one tree."; + + private static int find(int x) { + if (parent[x] != x) return find(parent[x]); + return parent[x]; + } + + private static void union(int u, int v) { + int pu = find(u); + int pv = find(v); + + if (pu==pv) { // 부모가 같으면 사이클이 존재 + isCycle[pu] = true; + return; + } + + parent[pv] = pu; // 부모다르면 합치기 + isCycle[pu] = isCycle[pu] || isCycle[pv]; // 사이클 여부도 합치기 + } + + private static int cntTree(int N) { + int cnt = 0; + for (int i = 1; i < N + 1; i++) { + if (parent[i]==i && !isCycle[i]) cnt++; // 해당 그룹이 사이클 가지지 않으면 트리(루트 노드 기준) + } + return cnt; + } + private static void init(int N) { + parent = new int[N + 1]; + isCycle = new boolean[N + 1]; + + for (int i = 1; i < N + 1; i++) { + parent[i] = i; + } + } + public static void main(String[] args) throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + StringTokenizer st; + StringBuilder sb = new StringBuilder(); + + int idx = 1; + while (true) { + st = new StringTokenizer(br.readLine()); + int N = Integer.parseInt(st.nextToken()); + int M = Integer.parseInt(st.nextToken()); + + if (N==0 && M==0) break; + + init(N); + for (int i = 0; i < M; i++) { + st = new StringTokenizer(br.readLine()); + int u = Integer.parseInt(st.nextToken()); + int v = Integer.parseInt(st.nextToken()); + union(u, v); + } + int cnt = cntTree(N); + + sb.append("Case ").append(idx).append(": "); + if (cnt==0) sb.append(cnt0); + else if (cnt==1) sb.append(cnt1); + else sb.append("A forest of ").append(cnt).append(" trees."); + sb.append('\n'); + idx++; + } + System.out.println(sb); + } +} diff --git "a/BOJ/20001-25000353円262円210円/SB_22944.java" "b/BOJ/20001-25000353円262円210円/SB_22944.java" index a6c3c3e9..74ea2834 100644 --- "a/BOJ/20001-25000353円262円210円/SB_22944.java" +++ "b/BOJ/20001-25000353円262円210円/SB_22944.java" @@ -1,5 +1,3 @@ -package bfs; - import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; diff --git "a/BOJ/5001-10000353円262円210円/SB_9372.java" "b/BOJ/5001-10000353円262円210円/SB_9372.java" new file mode 100644 index 00000000..8a24808a --- /dev/null +++ "b/BOJ/5001-10000353円262円210円/SB_9372.java" @@ -0,0 +1,27 @@ +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.StringTokenizer; + +public class SB_9372 { + static int N, M; + public static void main(String[] args) throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + StringTokenizer st; + StringBuilder sb = new StringBuilder(); + + int T = Integer.parseInt(br.readLine()); + + while (T--> 0) { + st = new StringTokenizer(br.readLine()); + N = Integer.parseInt(st.nextToken()); + M = Integer.parseInt(st.nextToken()); + + for (int i = 0; i < M; i++) { + st = new StringTokenizer(br.readLine()); + } + sb.append(N - 1).append('\n'); + } + System.out.println(sb); + } +} diff --git "a/CodeTree/2019-2020353円205円204円/SB_354円234円267円353円206円200円354円235円264円_354円202円254円352円270円260円353円213円250円.java" "b/CodeTree/2019-2020353円205円204円/SB_354円234円267円353円206円200円354円235円264円_354円202円254円352円270円260円353円213円250円.java" new file mode 100644 index 00000000..2ae464d3 --- /dev/null +++ "b/CodeTree/2019-2020353円205円204円/SB_354円234円267円353円206円200円354円235円264円_354円202円254円352円270円260円353円213円250円.java" @@ -0,0 +1,101 @@ +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.*; + +public class SB_윷놀이_사기단 { + static int[] arr = new int[10]; + static HashMap moveIdx = new HashMap(); + static HashMap score = new HashMap(); + + private static void init() { + // 보드 초기화 + moveIdx.put(0, new int[]{1, 2, 3, 4, 5}); // 시작 + moveIdx.put(1, new int[]{2, 3, 4, 5, 6}); + moveIdx.put(2, new int[]{3, 4, 5, 6, 7}); + moveIdx.put(3, new int[]{4, 5, 6, 7, 8}); + moveIdx.put(4, new int[]{5, 6, 7, 8, 9}); + moveIdx.put(5, new int[]{21, 22, 23, 24, 25}); // 첫번째 파란 지점 + moveIdx.put(6, new int[]{7, 8, 9, 10, 11}); + moveIdx.put(7, new int[]{8, 9, 10, 11, 12}); + moveIdx.put(8, new int[]{9, 10, 11, 12, 13}); + moveIdx.put(9, new int[]{10, 11, 12, 13, 14}); + moveIdx.put(10, new int[]{27, 28, 24, 25, 26}); // 두번째 파란 지점 + moveIdx.put(11, new int[]{12, 13, 14, 15, 16}); + moveIdx.put(12, new int[]{13, 14, 15, 16, 17}); + moveIdx.put(13, new int[]{14, 15, 16, 17, 18}); + moveIdx.put(14, new int[]{15, 16, 17, 18, 19}); + moveIdx.put(15, new int[]{29, 30, 31, 24, 25}); // 세번째 파란 지점 + moveIdx.put(16, new int[]{17, 18, 19, 20, -1}); + moveIdx.put(17, new int[]{18, 19, 20, -1, -1}); + moveIdx.put(18, new int[]{19, 20, -1, -1, -1}); + moveIdx.put(19, new int[]{20, -1, -1, -1, -1}); + moveIdx.put(20, new int[]{-1, -1, -1, -1, -1}); // 점수 40에 해당하는 도착 바로전 + moveIdx.put(21, new int[]{22, 23, 24, 25, 26}); // 첫번째 파란 지점에서 빨간 화살표 이동(13) + moveIdx.put(22, new int[]{23, 24, 25, 26, 20}); + moveIdx.put(23, new int[]{24, 25, 26, 20, -1}); + moveIdx.put(24, new int[]{25, 26, 20, -1, -1}); + moveIdx.put(25, new int[]{26, 20, -1, -1, -1}); + moveIdx.put(26, new int[]{20, -1, -1, -1, -1}); + moveIdx.put(27, new int[]{28, 24, 25, 26, 20}); // 두번째 파란 지점에서 빨간 화살표 이동(22) + moveIdx.put(28, new int[]{24, 25, 26, 20, -1}); + moveIdx.put(29, new int[]{30, 31, 24, 25, 26}); + moveIdx.put(30, new int[]{31, 24, 25, 26, 20}); + moveIdx.put(31, new int[]{24, 25, 26, 20, -1}); + + // 점수 초기화 + score.put(-1, 0); + for (int i = 0; i < 21; i++) { + score.put(i, i * 2); + } + score.put(21, 13); + score.put(22, 16); + score.put(23, 19); + score.put(24, 25); + score.put(25, 30); + score.put(26, 35); + score.put(27, 22); + score.put(28, 24); + score.put(29, 28); + score.put(30, 27); + score.put(31, 26); + } + + static int ans = 0; + + private static void dfs(int hidx, int cnt, int total, List pos) { // 움직일 말 번호, 주사위 던진 횟수, 현재까지 점수, 말들의 위치 + List tmpPos = new ArrayList(pos); + int curDice = arr[cnt] - 1; // 현재 주사위 값 + tmpPos.set(hidx, moveIdx.get(tmpPos.get(hidx))[curDice]); // 선택한 말 이동 (현재 말의 위치에서 주사위 값만큼 이동) + int curScore = score.get(tmpPos.get(hidx)); // 말 이동 후 점수 + + if (cnt == 9) { // 주사위 10번 모두 던지면 최종 점수 계산 후 리턴 + ans = Math.max(ans, total + curScore); + return; + } + + int nxtDice = arr[cnt + 1] - 1; // 다음 주사위 값 + for (int i = 0; i < 4; i++) { // 4개말 중 선택 + if (tmpPos.get(i)==-1) continue; // 이미 도착한 말은 패쓰 + int nxtPos = moveIdx.get(tmpPos.get(i))[nxtDice]; // 선택한 말의 다음 위치 + if (nxtPos !=-1 && tmpPos.contains(nxtPos)) continue; // 다음 위치에 다른 말이 이미 있으면 패쓰 + dfs(i, cnt + 1, total + curScore, tmpPos); // 선택한 말로 dfs 수행 + } + + } + public static void main(String[] args) throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + StringTokenizer st = new StringTokenizer(br.readLine()); + + for (int i = 0; i < 10; i++) { + arr[i] = Integer.parseInt(st.nextToken()); + } + + init(); + + List pos = new ArrayList(Arrays.asList(0, 0, 0, 0)); + dfs(0, 0, 0, pos); + + System.out.println(ans); + } +} diff --git a/Programmers/Level3/SB_42892.java b/Programmers/Level3/SB_42892.java new file mode 100644 index 00000000..01070a6f --- /dev/null +++ b/Programmers/Level3/SB_42892.java @@ -0,0 +1,90 @@ +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class SB_42892 { + static int N; + static Node[] tree; + + private static void postOrder(Node node, List post) { + if (node==null) return; // 리프노드에서 더 이상 노드가 없으면 리턴 + + postOrder(node.left, post); + postOrder(node.right, post); + post.add(node.n); + } + private static void preOrder(Node node, List pre) { + if (node==null) return; // 리프노드에서 더 이상 노드가 없으면 리턴 + + pre.add(node.n); + preOrder(node.left, pre); + preOrder(node.right, pre); + } + + private static void setChild(Node parent, Node child) { + if (child.x < parent.x){ // 왼쪽 노드 정하기 + if (parent.left==null) parent.left = child; // 왼쪽 자리 비었으면 child로 설정 + else setChild(parent.left, child); // 비어있지 않으면 왼쪽 노드를 부모로 하는 child 설정 + }else { // 오른쪽 노드 정하기 + if (parent.right==null) parent.right = child; + else setChild(parent.right, child); + } + } + public static int[][] solution(int[][] nodeinfo) { + N = nodeinfo.length; + tree = new Node[N]; + + // 노드 값 포함해서 트리 배열 재구성 + for (int i = 0; i < N; i++) { + int[] n = nodeinfo[i]; + tree[i] = new Node(n[0], n[1], i + 1); + } + Arrays.sort(tree); + + // 각 노드의 오른쪽, 왼쪽 값 설정 + Node root = tree[0]; + for (int i = 1; i < N; i++) { + setChild(root, tree[i]); + } + + // 전위 순회 + List pre = new ArrayList(); + preOrder(root, pre); + + // 후위 순회 + List post = new ArrayList(); + postOrder(root, post); + + int[][] ans = new int[2][N]; + ans[0] = pre.stream().mapToInt(i->i).toArray(); + ans[1] = post.stream().mapToInt(i -> i).toArray(); + return ans; + } + + static class Node implements Comparable{ + int x, y, n; + Node left = null; + Node right = null; + + public Node(int x, int y, int n) { + this.x = x; + this.y = y; + this.n = n; + } + + @Override + public int compareTo(Node o) { + if (o.y-this.y==0) return this.x-o.x; + return o.y-this.y; + } + + @Override + public String toString() { + return "Node{" + + "x=" + x + + ", y=" + y + + ", n=" + n + + '}'; + } + } +} diff --git "a/SQL/15354円243円274円354円260円250円/SB_Game Play Analysis IV.sql" "b/SQL/15354円243円274円354円260円250円/SB_Game Play Analysis IV.sql" new file mode 100644 index 00000000..8084917b --- /dev/null +++ "b/SQL/15354円243円274円354円260円250円/SB_Game Play Analysis IV.sql" @@ -0,0 +1,12 @@ +# Write your MySQL query statement below +# 처음 로그인한 다음 날 다시 로그인한 플레이어의 비율을 소수점 2자리로 반올림하여 보고 +# 첫 로그인 날짜부터 최소 이틀 연속으로 로그인한 플레이어 수를 계산한 다음 그 숫자를 총 플레이어 수로 나누어야 함 + +WITH FIRST AS ( + SELECT player_id, MIN(event_date) as first_date + FROM Activity + GROUP BY player_id +) +SELECT ROUND(COUNT(DISTINCT(a.player_id)) / COUNT(DISTINCT(f.player_id)), 2) AS fraction +FROM FIRST f +LEFT JOIN Activity a ON f.player_id = a.player_id AND DATEDIFF(a.event_date, f.first_date) = 1 diff --git "a/SQL/15354円243円274円354円260円250円/SB_Restaurant Growth.sql" "b/SQL/15354円243円274円354円260円250円/SB_Restaurant Growth.sql" new file mode 100644 index 00000000..d35525bc --- /dev/null +++ "b/SQL/15354円243円274円354円260円250円/SB_Restaurant Growth.sql" @@ -0,0 +1,24 @@ +# Write your MySQL query statement below +-- 고객이 7일 동안 지불한 금액의 이동 평균(즉, 현재 날짜 + 6일 전)을 계산 +-- 평균_금액은 소수점 이하 두 자리로 반올림 +-- visited_on 오름차순으로 정렬 + + +SELECT visited_on, + ( + SELECT SUM(amount) + FROM Customer + WHERE visited_on BETWEEN DATE_SUB(c.visited_on, INTERVAL 6 DAY) AND c.visited_on + ) AS amount, + ROUND( + (SELECT SUM(amount) / 7 + FROM Customer + WHERE visited_on BETWEEN DATE_SUB(c.visited_on, INTERVAL 6 DAY) AND c.visited_on) + , 2 + ) AS average_amount +FROM Customer c +WHERE visited_on>= ( + SELECT DATE_ADD(min(visited_on), INTERVAL 6 DAY) + FROM Customer +) +GROUP BY visited_on \ No newline at end of file

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