From 1a7570bc68242f25b1d60cd1ba6e28afaa8b0add Mon Sep 17 00:00:00 2001 From: heoseungyeon Date: Tue, 17 Aug 2021 13:32:27 +0900 Subject: [PATCH 1/2] 1991 --- syheo/baekjoon_java/Main_1991.java | 109 +++++++++++++++++++++++++++++ 1 file changed, 109 insertions(+) create mode 100644 syheo/baekjoon_java/Main_1991.java diff --git a/syheo/baekjoon_java/Main_1991.java b/syheo/baekjoon_java/Main_1991.java new file mode 100644 index 0000000..f9085e2 --- /dev/null +++ b/syheo/baekjoon_java/Main_1991.java @@ -0,0 +1,109 @@ +package syheo.baekjoon_java; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.StringTokenizer; + +/** + * solved.ac + * 백준 + * 1991 + * 트리 순회 + * 트리 + * 실버 1 + * + * 아이디어 : + * leftChild, rightChild, id 를 갖는 Node 클래스를 만들어 트리를 구성하고 + * 전위, 중위, 후위 순회에 따라 재귀호출을 통해 방문 처리 + */ + +public class Main_1991 { + + static int N; + static BufferedReader input = new BufferedReader(new InputStreamReader(System.in)); + static StringTokenizer tokens; + static StringBuffer sb = new StringBuffer(); + static Node[] nodes = new Node[26]; + + static class Node{ + char id; + Node leftChild; + Node rightChild; + + public Node(char id) { + this.id = id; + this.leftChild = null; + this.rightChild = null; + } + } + + public static void main(String[] args) throws IOException { + + // 1. input + N = Integer.parseInt(input.readLine()); + for (int i = 0; i < N; i++) { + nodes[i] = new Node((char)(65+i)); + } + for (int i = 0; i < N; i++) { + tokens = new StringTokenizer(input.readLine()); + char parent = tokens.nextToken().charAt(0); + char left = tokens.nextToken().charAt(0); + char right = tokens.nextToken().charAt(0); + + if(left != '.'){ + nodes[parent-'A'].leftChild = nodes[left-'A']; + } + if(right != '.'){ + nodes[parent-'A'].rightChild = nodes[right-'A']; + } + } + + // 2-1.pre + preVisited('A'); + + // 2-2.order + sb.append("\n"); + orderVisited('A'); + + // 2-3.post + sb.append("\n"); + postVisited('A'); + + // 3. result + System.out.println(sb.toString()); + + } + + private static void preVisited(char node) { + sb.append(node); + if(nodes[node-'A'].leftChild!=null){ + preVisited(nodes[node-'A'].leftChild.id); + } + if(nodes[node-'A'].rightChild!=null){ + preVisited(nodes[node-'A'].rightChild.id); + } + } + + private static void orderVisited(char node) { + if(nodes[node-'A'].leftChild!=null){ + orderVisited(nodes[node-'A'].leftChild.id); + } + sb.append(node); + if(nodes[node-'A'].rightChild!=null){ + orderVisited(nodes[node-'A'].rightChild.id); + } + + } + + private static void postVisited(char node) { + if(nodes[node-'A'].leftChild!=null){ + postVisited(nodes[node-'A'].leftChild.id); + } + if(nodes[node-'A'].rightChild!=null){ + postVisited(nodes[node-'A'].rightChild.id); + } + sb.append(node); + } + +} From 93033b0dbdad943f1a021d378bb3a59460f196b2 Mon Sep 17 00:00:00 2001 From: heoseungyeon Date: Wed, 18 Aug 2021 10:11:16 +0900 Subject: [PATCH 2/2] 1484 --- syheo/baekjoon_java/Main_1484.java | 81 ++++++++++++++++++++++++++++++ 1 file changed, 81 insertions(+) create mode 100644 syheo/baekjoon_java/Main_1484.java diff --git a/syheo/baekjoon_java/Main_1484.java b/syheo/baekjoon_java/Main_1484.java new file mode 100644 index 0000000..897e986 --- /dev/null +++ b/syheo/baekjoon_java/Main_1484.java @@ -0,0 +1,81 @@ +package syheo.baekjoon_java; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.Collections; +import java.util.LinkedList; + +/** + * solved.ac + * 백준 + * 1484 + * 다이어트 + * 투 포인터 + * 골드 4 + * 아이디어 : + * 일단 문제를 보고 어느 뽀인트에서 투 포인터 알고리즘을 생각해야 될까? + * G 의 정의가 현재 몸무게의 제곱에서 이전 몸무게의 제곱을 뺀 값이다. + * 그렇다면 현재 몸무게의 후보군(범위)과 이전 몸무게의 후보군(범위)에 대해서 모두 완전 탐색해야 될 것이다. + * 하지만 그러면 너무 비용이 크다. 비용을 줄이기 위해 + * O(N) 시간 복잡도를 가지는 투 포인터를 통해서 접근하면 문제를 쉽게 해결 할 수 있을 것이다. + * 그리고 몸무게의 범위를 알아야 한다. 일단 최솟값은 1일 테고(몸무게니깐 ; ) + * 최댓값은 (50000^2-49999^2)=99999 의 경우인데 이거를 어떻게 찾을까 ㅋ + */ + +public class Main_1484 { + + static int G; //100,000 보다 작거나 같은 자연수 + static final int MinWeight = 1; + static final int MaxWeight = 100000; + static int start; + static int end; + static int value; + static LinkedList weights = new LinkedList<>(); + static BufferedReader input = new BufferedReader(new InputStreamReader(System.in)); + + static int calculate(int start, int end) { + return (int) (Math.pow(end, 2) - Math.pow(start, 2)); + } + + public static void main(String[] args) throws IOException { + // 1. input + G = Integer.parseInt(input.readLine()); + + // 2. start two pointer algorithm + start = MaxWeight - 1; + end = MaxWeight; + + // end가 MinWeight 이 될때까지 + while (end != MinWeight) { + value = calculate(start, end); // 계산 결과 + if(start == end){ //같아지면 start -- + start--; + continue; + } + + if (value == G) { // 정답 조건 + weights.add(end); + start--; + end--; + } else if (value > G) { + end--; + } else { + if (start > MinWeight) start--; + else break; // start 가 MinWeight인데도 value가 작다? 이제 답 없음. + // else end--; // 이거 안해도될듯? + } + } + + Collections.sort(weights); + + if(weights.isEmpty()){ + System.out.println(-1); + } + for (int i = 0; i < weights.size(); i++) { + System.out.println(weights.get(i)); + } + + + } +}