diff --git "a/BOJ/[20920] \354\230\201\353\213\250\354\226\264 \354\225\224\352\270\260\353\212\224 \352\264\264\353\241\234\354\233\214/nkw601/Main.java" "b/BOJ/[20920] \354\230\201\353\213\250\354\226\264 \354\225\224\352\270\260\353\212\224 \352\264\264\353\241\234\354\233\214/nkw601/Main.java" new file mode 100644 index 0000000..653bb7b --- /dev/null +++ "b/BOJ/[20920] \354\230\201\353\213\250\354\226\264 \354\225\224\352\270\260\353\212\224 \352\264\264\353\241\234\354\233\214/nkw601/Main.java" @@ -0,0 +1,52 @@ +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.HashMap; +import java.util.StringTokenizer; + +public class Main { + private static int N, M; // 지문에 나오는 단어 수, 외울 단어의 길이 기준(M 이상만 외움) + private static HashMap words; + 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(); + // 입력, 초기화 + N = Integer.parseInt(st.nextToken()); + M = Integer.parseInt(st.nextToken()); + words = new HashMap<>(); + + for(int i = 0; i < N; i++) { + String word = br.readLine(); + // 길이가 M 이상일 때에만 외움 + if(word.length() >= M) { + // getOrDefault + words.put(word, words.getOrDefault(word, 0) + 1); + } + } + + // 자주 나오는 단어면 앞에 + // 단어의 길이가 길면 앞에 + // 알파벳 사전 순으로 앞이면 앞에 + ArrayList wordsList = new ArrayList<>(words.keySet()); + Collections.sort(wordsList, (o1, o2) -> { + int f1 = words.get(o1), f2 = words.get(o2); + if (f1 != f2) return Integer.compare(f2, f1); // 빈도 + int l1 = o1.length(), l2 = o2.length(); + if (l1 != l2) return Integer.compare(l2, l1); // 길이 + return o1.compareTo(o2); // 사전순 + }); + + + for(String word : wordsList) { + sb.append(word).append("\n"); + } + + System.out.println(sb); + + } + +} diff --git "a/BOJ/[2512] \354\230\210\354\202\260/nkw601/Main.java" "b/BOJ/[2512] \354\230\210\354\202\260/nkw601/Main.java" new file mode 100644 index 0000000..47d8a8b --- /dev/null +++ "b/BOJ/[2512] \354\230\210\354\202\260/nkw601/Main.java" @@ -0,0 +1,55 @@ +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.StringTokenizer; + +public class Main { + private static int N, M; + private static int[] budgets; + + public static void main(String[] args) throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + StringTokenizer st; + + N = Integer.parseInt(br.readLine()); + budgets = new int[N]; + + st = new StringTokenizer(br.readLine()); + int maxReq = 0; + long sum = 0; + for (int i = 0; i < N; i++) { + budgets[i] = Integer.parseInt(st.nextToken()); + sum += budgets[i]; + if (budgets[i] > maxReq) maxReq = budgets[i]; + } + + M = Integer.parseInt(br.readLine()); + + if (sum <= M) { + System.out.println(maxReq); + return; + } + + int low = 0; + int high = maxReq; + int ans = 0; + + while (low <= high) { + int mid = (low + high) / 2; + long s = 0; + + for (int b : budgets) { + s += (b > mid) ? mid : b; + } + + if (s <= M) { + ans = mid; + low = mid + 1; + } else { + high = mid - 1; + } + } + + System.out.println(ans); + } +} diff --git "a/BOJ/[5972] \355\203\235\353\260\260 \353\260\260\354\206\241/nkw601/Main.java" "b/BOJ/[5972] \355\203\235\353\260\260 \353\260\260\354\206\241/nkw601/Main.java" new file mode 100644 index 0000000..f62a15f --- /dev/null +++ "b/BOJ/[5972] \355\203\235\353\260\260 \353\260\260\354\206\241/nkw601/Main.java" @@ -0,0 +1,85 @@ +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.PriorityQueue; +import java.util.StringTokenizer; + +public class Main { + private static int N, M; + private static int[] stovers; // stovers: i번째 헛간까지 도착하는 최소 여물 수 + private static ArrayList[] barns; + 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()); + M = Integer.parseInt(st.nextToken()); + + // 초기화 + stovers = new int[N + 1]; + Arrays.fill(stovers, Integer.MAX_VALUE); + barns = new ArrayList[N + 1]; + for(int i = 1; i <= N; i++) { + barns[i] = new ArrayList<>(); + } + + for(int i = 0; i < M; i++) { + st = new StringTokenizer(br.readLine()); + int a = Integer.parseInt(st.nextToken()); + int b = Integer.parseInt(st.nextToken()); + int c = Integer.parseInt(st.nextToken()); + + // 인접리스트 만들기 + barns[a].add(new int[] {b, c}); + barns[b].add(new int[] {a, c}); + } + + dijkstra(1, N); + System.out.println(stovers[N]); + } + + + private static void dijkstra(int start, int end) { + PriorityQueue pq = new PriorityQueue<>((o1, o2) -> Integer.compare(o1[1], o2[1])); + stovers[start] = 0; + pq.offer(new int[] {start, 0}); + + while(!pq.isEmpty()) { + int[] cur = pq.poll(); + + int curBarn = cur[0]; + int curWei = cur[1]; + + if(curWei > stovers[curBarn]) continue; // 방문처리 + + for(int[] next : barns[curBarn]) { + int nextBarn = next[0]; + int nextWei = next[1] + curWei; + + if(nextWei < stovers[nextBarn]) { + pq.offer(new int[] {nextBarn, nextWei}); + stovers[nextBarn] = nextWei; + } + } + } + } +} +/* + * 입력 + * N M + * M: A_i B_i C_i + * + * 출력 + * 농부 현서가 가져가야하는 최소 여물 + * + * 이해 + * N개의 헛간, M개의 양방향 길 + * 각각의 길의 가중치 C(소 수) + * + * 헛간 1 -> 헛간 N + * + * 생각 + * 최단 거리 with 가중치 -> 다익스트라 + */ \ No newline at end of file