diff --git "a/BOJ/1000-5000\353\262\210/HW_1030.java" "b/BOJ/1000-5000\353\262\210/HW_1030.java" new file mode 100644 index 00000000..90c68997 --- /dev/null +++ "b/BOJ/1000-5000\353\262\210/HW_1030.java" @@ -0,0 +1,52 @@ +import java.io.*; +import java.util.*; + +// 프렉탈 평면이 단위 시간이 진행될 때 마다 크기가 증가함 +// 프랙탈 한변 길이 : N^S +// 검정색 영역이 아닌 경우 색을 결정할 수 없음 +// 현재 시간에서 해당 위치 어떤 색인지 결정 X +// 색을 결정하려면? 더 작은 블록(상위 패턴)의 좌표로 이동해서 재귀적으로 확인 해줘야함 +public class HW_1030 { + static int S, N, K, R1, R2, C1, C2; + public static void main(String[] args) throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + StringTokenizer st = new StringTokenizer(br.readLine()); + + 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 size = (int) Math.pow(N, S); // 프랙탈 한변 길이 : N^S + + // 주어진 범위만 확인 + for (int r = R1; r <= R2; r++) { + for (int c = C1; c <= C2; c++) { + System.out.print(isCheck(r, c, size)); // 각 좌표의 색 계산 + } + System.out.println(); + } + } + + static int isCheck(int r, int c, int size) { + if (size == 1) { // 단위 시간 0일 때 + return 0; // 흰색(0) 정사각형 한 개 + } + + int curSize = size / N; // 현재 블록 크기 + int s = curSize * (N - K) / 2; // 검정 영역 시작 + int e = curSize * (N + K) / 2; // 검정 영역 끝 + + // 현재 좌표가 검정 영역에 속하면 색을 바로 반환(1) + if (s <= r && r < e && s <= c && c < e) { + return 1; + } + + // 검정 영역에 속하지 않으면 + // 좌표를 상위 블록으로 변환하여 재귀적으로 확인 + return isCheck(r % curSize, c % curSize, curSize); + } +} diff --git "a/BOJ/1000-5000\353\262\210/HW_1725.java" "b/BOJ/1000-5000\353\262\210/HW_1725.java" new file mode 100644 index 00000000..613c39df --- /dev/null +++ "b/BOJ/1000-5000\353\262\210/HW_1725.java" @@ -0,0 +1,34 @@ + +import java.io.*; +import java.util.*; + +// N<= 10^5 시간 복잡도 : O(N) +public class HW_1725 { + public static void main(String[] args) throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + int N = Integer.parseInt(br.readLine()); + int[] heights = new int[N+1]; + + for(int i=0; i stack = new Stack<>(); // 막대 높이를 저장 + long max = 0; // 막대의 높이(10^9) * 너비(10^5) -> long + + for(int i=0; i 현재 인덱스(i)가 넓이 w=i; + // 스택이 비어있지X 경우 -> 왼쪽 경계(왼쪽에 남아있는 막대) w = i - stack.peek()-1; + // 현재 막대와의 간격만큼만 직사각형을 확장할 수 있기 때문 + max = Math.max(max, (long)h*w);// 꺼낸 높이 기준으로 넓이 계산 + } + stack.push(i); + } + return max; + } +} diff --git "a/BOJ/1000-5000\353\262\210/HW_1992.java" "b/BOJ/1000-5000\353\262\210/HW_1992.java" new file mode 100644 index 00000000..afbda90a --- /dev/null +++ "b/BOJ/1000-5000\353\262\210/HW_1992.java" @@ -0,0 +1,48 @@ +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.*; + +public class HW_1992 { + static int N; + static char[][] board; + static StringBuilder sb = new StringBuilder(); + public static void main(String[] args) throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + + int N = Integer.parseInt(br.readLine()); + board = new char[N][N]; + for(int i=0; i> graph; + static boolean[] visited; + public static void main(String[] args) throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + int test = 1; + + while(true){ + StringTokenizer st = new StringTokenizer(br.readLine()); + int N = Integer.parseInt(st.nextToken()); + int M = Integer.parseInt(st.nextToken()); + + if(N == 0 && M == 0) { + break; + } + graph = new ArrayList<>(); + for(int i=0; i<=N; i++) { + graph.add(new ArrayList<>()); + } + + for(int i=0; i queue = new LinkedList<>(); // 큐 초기화 + queue.add(new int[] {node, parent}); // {탐색 시작할 정점, node의 부모 정점} + visited[node] = true; + int nodeCnt = 0; // 연결 요소에서 방문한 정점 개수 cnt + int edgeCnt = 0; // 연결 요소에서 방문한 간선 개수 cnt + + while(!queue.isEmpty()) { + int[] cur = queue.poll(); // 큐에서 현재 노드, 부모 노드를 가져옴 + int curNode = cur[0]; // 현재 노드 + int curParent = cur[1]; // 부모 노드 + + nodeCnt++; // 정점 개수++ + + for(int i=0; i MST(최소 스패닝트리) +// 모든 국가를 연결하는데 필요한 최선 간선의 수 찾기 +// 연결된 그래프에서 MST 간선수 : N-1개 +public class HW_9372 { + public static void main(String[] args) throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + StringTokenizer st; + int T = Integer.parseInt(br.readLine()); + + for(int i=0; i O(N^2) 이하 +class HW_42892 { + static int index; + static int[][] answer; + static class Node{ + int x, y, number; + Node left, right; + + Node(int x, int y, int number){ + this.x = x; + this.y = y; + this.number = number; + } + } + public int[][] solution(int[][] nodeinfo) { + Node[] nodes= new Node[nodeinfo.length]; + + for(int i=0; i{ // 노드 정렬 + if(a.y != b.y){ + return b.y - a.y; // y 내림차순 + } + return a.x - b.x; // x 오름차순 + }); + + // 트리 생성 + Node root = nodes[0]; + for(int i=1; i왼쪽->오른쪽) + index = 0; // 인덱스 초기화 + postorder(root); // 후위 순회(왼쪽->오른쪽->부모) + + return answer; + + } + static void insertNode(Node parent, Node child) { + if (child.x < parent.x) { // 왼쪽 서브트리 + if (parent.left == null) { + parent.left = child; + } else { + insertNode(parent.left, child); + } + } else { // 오른쪽 서브트리 + if (parent.right == null) { + parent.right = child; + } else { + insertNode(parent.right, child); + } + } + } + + static void preorder(Node node){ + if(node != null){ + answer[0][index++] = node.number; // 부모 노드 방문 + preorder(node.left); // 왼쪽 서브트리 방문 + preorder(node.right); // 오른쪽 서브트리 방문 + } + } + static void postorder(Node node){ + if(node != null){ + postorder(node.left); // 왼쪽 서브트리 방문 + postorder(node.right); // 오른쪽 서브트리 방문 + answer[1][index++] = node.number; // 부모 노드 방문 + } + } +} \ No newline at end of file diff --git "a/SQL/15\354\243\274\354\260\250/HW_Confirmation Rate.sql" "b/SQL/15\354\243\274\354\260\250/HW_Confirmation Rate.sql" new file mode 100644 index 00000000..b6b1cf38 --- /dev/null +++ "b/SQL/15\354\243\274\354\260\250/HW_Confirmation Rate.sql" @@ -0,0 +1,8 @@ +SELECT s.user_id, + CASE WHEN c.user_id IS NULL THEN 0 -- NULL일시 0 출력 + ELSE ROUND(SUM(c.action = 'confirmed') / COUNT(s.user_id), 2) + END AS confirmation_rate +FROM Signups s + LEFT JOIN Confirmations c + ON s.user_id = c.user_id +GROUP BY s.user_id; \ No newline at end of file diff --git "a/SQL/15\354\243\274\354\260\250/HW_Second Highest Salary.sql" "b/SQL/15\354\243\274\354\260\250/HW_Second Highest Salary.sql" new file mode 100644 index 00000000..15df45c8 --- /dev/null +++ "b/SQL/15\354\243\274\354\260\250/HW_Second Highest Salary.sql" @@ -0,0 +1,7 @@ +-- 두번째로 큰 salary 값 출력하기, 없으면 null 출력 +SELECT IFNULL( + (SELECT DISTINCT salary + FROM Employee + ORDER BY salary DESC + LIMIT 1 OFFSET 1), null) +as SecondHighestSalary; \ No newline at end of file