diff --git a/.classpath b/.classpath
deleted file mode 100644
index 1938c4d..0000000
--- a/.classpath
+++ /dev/null
@@ -1,10 +0,0 @@
-
-
-
-
-
-
-
-
-
-
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..ecbec2c
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,5 @@
+input.txt
+Main.java
+Main.class
+Solution.java
+out
diff --git a/.idea/.gitignore b/.idea/.gitignore
new file mode 100644
index 0000000..13566b8
--- /dev/null
+++ b/.idea/.gitignore
@@ -0,0 +1,8 @@
+# Default ignored files
+/shelf/
+/workspace.xml
+# Editor-based HTTP Client requests
+/httpRequests/
+# Datasource local storage ignored files
+/dataSources/
+/dataSources.local.xml
diff --git a/.idea/misc.xml b/.idea/misc.xml
new file mode 100644
index 0000000..c3b5975
--- /dev/null
+++ b/.idea/misc.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/modules.xml b/.idea/modules.xml
new file mode 100644
index 0000000..f4fb4ef
--- /dev/null
+++ b/.idea/modules.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/uiDesigner.xml b/.idea/uiDesigner.xml
new file mode 100644
index 0000000..2b63946
--- /dev/null
+++ b/.idea/uiDesigner.xml
@@ -0,0 +1,124 @@
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
+
+ -
+
+
+
+
+
+ -
+
+
+
+
+
+ -
+
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
+ -
+
+
+ -
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/vcs.xml b/.idea/vcs.xml
new file mode 100644
index 0000000..35eb1dd
--- /dev/null
+++ b/.idea/vcs.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.project b/.project
deleted file mode 100644
index 4cab2ff..0000000
--- a/.project
+++ /dev/null
@@ -1,23 +0,0 @@
-
-
- Algorithms
-
-
-
-
-
- org.eclipse.jdt.core.javabuilder
-
-
-
-
- org.eclipse.wst.common.project.facet.core.builder
-
-
-
-
-
- org.eclipse.wst.common.project.facet.core.nature
- org.eclipse.jdt.core.javanature
-
-
diff --git a/.settings/org.eclipse.jdt.core.prefs b/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index 0c68a61..0000000
--- a/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,7 +0,0 @@
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
-org.eclipse.jdt.core.compiler.compliance=1.8
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.source=1.8
diff --git a/.settings/org.eclipse.wst.common.project.facet.core.xml b/.settings/org.eclipse.wst.common.project.facet.core.xml
deleted file mode 100644
index f4ef8aa..0000000
--- a/.settings/org.eclipse.wst.common.project.facet.core.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-
-
-
-
diff --git a/Algorithms.iml b/Algorithms.iml
new file mode 100644
index 0000000..b107a2d
--- /dev/null
+++ b/Algorithms.iml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Main.class b/Main.class
new file mode 100644
index 0000000..aa40708
Binary files /dev/null and b/Main.class differ
diff --git a/Solution.java b/Solution.java
new file mode 100644
index 0000000..f84f166
--- /dev/null
+++ b/Solution.java
@@ -0,0 +1,33 @@
+import java.io.*;
+import java.util.*;
+
+public class Solution {
+ public static void main(String[] args) throws Exception {
+
+ System.setIn(new FileInputStream("input.txt"));
+ BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); // 빠른 읽기
+ StringTokenizer st = null;
+ StringBuilder sb = new StringBuilder();
+
+ int t = Integer.parseInt(br.readLine());
+
+ for (int tc=1; tc<=t; tc++) {
+ st = new StringTokenizer(br.readLine());
+ int n = Integer.parseInt(st.nextToken());
+ int p = Integer.parseInt(st.nextToken());
+
+ int[] study = new int[n];
+ boolean[] connect = new boolean[n];
+
+ st = new StringTokenizer(br.readLine());
+ for (int i=0; i bit로 대체
+ for (int j = 0; j < N; j++) { // boolean 배열 (i) 돌면서 뽑은거 확인
+ if((i & (1< 다음 집합으로 넘어감
+ }
+ }
+
+
+
+ //////////////////////
+ private static void M2_노래부를순서정하기_순열_NP() {
+ int[] p = new int[N];
+ for (int i = 0; i < N; i++) {
+ p[i] = i;
+ }
+ do {
+ ++totalCnt;
+ for (int i = 0; i < N; i++) {
+ //sb.append(input[p[i]]).append(" ");
+ }
+ //sb.append("\n");
+
+ } while (NP(p));
+
+ }
+
+
+
+ /////////////////////
+ private static void M4_노래부를팀만들기_조합_NP() {
+
+ // 배열 뒤부터 R개수만큼 1로 만듦 : 5C2라면 00011 이런형태로
+ int cnt = 0;
+ int[] p = new int[N];
+ while (++cnt <= R) {
+ p[N - cnt] = 1;
+ }
+
+ do {
+ ++totalCnt;
+ for (int i = 0; i < N; i++) {
+ if(p[i]==1) {
+ //sb.append(input[i]).append(" ");
+ }
+ }
+ //sb.append("\n");
+
+ } while (NP(p));
+
+ }
+
+
+ private static boolean NP(int[] p) {
+ int i = N - 1;
+ while (i > 0 && p[i - 1] >= p[i])
+ --i;
+
+ if (i == 0)
+ return false;
+
+ int j = N - 1;
+ while (p[i - 1] >= p[j])
+ --j;
+ swap(p, i - 1, j);
+
+ int k = N - 1;
+ while (i < k)
+ swap(p, i++, k--);
+
+ return true;
+
+ }
+
+ private static void swap(int[] p, int a, int b) {
+ int temp = p[a];
+ p[a] = p[b];
+ p[b] = temp;
+ }
+
+
+}
\ No newline at end of file
diff --git a/btype/Solution.java b/btype/Solution.java
new file mode 100644
index 0000000..6edd262
--- /dev/null
+++ b/btype/Solution.java
@@ -0,0 +1,89 @@
+package btype;
+
+import java.io.BufferedReader;
+import java.io.InputStreamReader;
+import java.util.StringTokenizer;
+
+class Solution {
+ private static BufferedReader br;
+ private static UserSolution usersolution = new UserSolution();
+
+ private final static int CMD_INIT = 100;
+ private final static int CMD_PUT = 200;
+ private final static int CMD_FIND = 300;
+ private final static int CMD_CHANGE = 400;
+
+ private final static int MAX_CARD_NUM = 5;
+ private final static int MAX_RET_NUM = 4;
+
+ private final static int numbers[] = new int[MAX_CARD_NUM];
+ private final static int ret_numbers[] = new int[MAX_RET_NUM];
+ private final static int ans_numbers[] = new int[MAX_RET_NUM];
+
+ private static boolean run() throws Exception {
+
+ StringTokenizer stdin = new StringTokenizer(br.readLine(), " ");
+
+ int query_num = Integer.parseInt(stdin.nextToken());
+ int ret, ans;
+ boolean ok = false;
+
+ for (int q = 0; q < query_num; q++) {
+ stdin = new StringTokenizer(br.readLine(), " ");
+ int query = Integer.parseInt(stdin.nextToken());
+
+ if (query == CMD_INIT) {
+ int joker = Integer.parseInt(stdin.nextToken());
+ for (int i = 0; i < MAX_CARD_NUM; i++)
+ numbers[i] = Integer.parseInt(stdin.nextToken());
+ usersolution.init(joker, numbers);
+ ok = true;
+ } else if (query == CMD_PUT) {
+ int dir = Integer.parseInt(stdin.nextToken());
+ for (int i = 0; i < MAX_CARD_NUM; i++)
+ numbers[i] = Integer.parseInt(stdin.nextToken());
+ usersolution.putCards(dir, numbers);
+ } else if (query == CMD_FIND) {
+ int num, Nth;
+ num = Integer.parseInt(stdin.nextToken());
+ Nth = Integer.parseInt(stdin.nextToken());
+ ans = Integer.parseInt(stdin.nextToken());
+ ret = usersolution.findNumber(num, Nth, ret_numbers);
+ if (ans != ret) {
+ ok = false;
+ }
+ if (ans == 1) {
+ for (int i = 0; i < MAX_RET_NUM; i++) {
+ ans_numbers[i] = Integer.parseInt(stdin.nextToken());
+ if (ans_numbers[i] != ret_numbers[i]) {
+ ok = false;
+ }
+ }
+ }
+ } else if (query == CMD_CHANGE) {
+ int value = Integer.parseInt(stdin.nextToken());
+ usersolution.changeJoker(value);
+ }
+
+ }
+ return ok;
+ }
+
+ public static void main(String[] args) throws Exception {
+ int T, MARK;
+
+ // System.setIn(new java.io.FileInputStream("res/sample_input.txt"));
+ br = new BufferedReader(new InputStreamReader(System.in));
+
+ StringTokenizer stinit = new StringTokenizer(br.readLine(), " ");
+ T = Integer.parseInt(stinit.nextToken());
+ MARK = Integer.parseInt(stinit.nextToken());
+
+ for (int tc = 1; tc <= T; tc++) {
+ int score = run() ? MARK : 0;
+ System.out.println("#" + tc + " " + score);
+ }
+
+ br.close();
+ }
+}
\ No newline at end of file
diff --git a/btype/UserSolution.java b/btype/UserSolution.java
new file mode 100644
index 0000000..6304f15
--- /dev/null
+++ b/btype/UserSolution.java
@@ -0,0 +1,17 @@
+package btype;
+
+class UserSolution {
+
+ void init(int mJoker, int mNumbers[]) {
+ }
+
+ void putCards(int mDir, int mNumbers[]) {
+ }
+
+ int findNumber(int mNum, int mNth, int ret[]) {
+ return -1;
+ }
+
+ void changeJoker(int mValue) {
+ }
+}
\ No newline at end of file
diff --git "a/d0806/DFS\354\231\200BFS.java" "b/d0806/DFS\354\231\200BFS.java"
new file mode 100644
index 0000000..77830ee
--- /dev/null
+++ "b/d0806/DFS\354\231\200BFS.java"
@@ -0,0 +1,93 @@
+// https://www.acmicpc.net/problem/1260
+// DFS와 BFS
+// 21632kb, 368ms
+
+import java.io.*;
+import java.util.*;
+
+public class DFS와BFS {
+
+ private static boolean bfsVisited[];
+ private static boolean dfsVisited[];
+ private static Map> graph;
+ private static int start;
+
+ public static void main(String[] args) throws Exception {
+ System.setIn(new FileInputStream("C:\\Users\\user\\Documents\\CAREER\\SSAFY\\Algorithms\\input.txt"));
+ BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+ BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
+ StringTokenizer st = new StringTokenizer(br.readLine());
+
+ int N = Integer.parseInt(st.nextToken());
+ int M = Integer.parseInt(st.nextToken());
+ start = Integer.parseInt(st.nextToken());
+
+ bfsVisited = new boolean[N+1];
+ dfsVisited = new boolean[N+1];
+
+ graph = new HashMap<>();
+
+ for (int i=0; i());
+ }
+ if (!graph.containsKey(n2)) {
+ graph.put(n2, new ArrayList());
+ }
+ graph.get(n1).add(n2);
+ graph.get(n2).add(n1);
+ }
+
+ for (int gk: graph.keySet()) {
+ Collections.sort(graph.get(gk));
+ }
+
+ dfs(start);
+ System.out.println();
+ bfs(start);
+
+ bw.flush();
+ bw.close();
+ br.close();
+
+ }
+
+ private static void dfs(int cur) {
+ dfsVisited[cur] = true;
+ System.out.printf(cur + " ");
+ List neighbor = graph.get(cur);
+ if (neighbor != null) {
+ for(int n: neighbor) {
+ if (!dfsVisited[n]) {
+ dfs(n);
+ }
+ }
+ }
+ }
+
+ private static void bfs(int start) {
+ Queue queue = new LinkedList<>();
+ queue.offer(start);
+ bfsVisited[start] = true;
+
+ while(!queue.isEmpty()) {
+ int cur = queue.poll();
+ System.out.printf(cur + " ");
+ List neighbors = graph.get(cur);
+ if (neighbors != null) {
+ for(int n: neighbors) {
+ if (!bfsVisited[n]) {
+ bfsVisited[n] = true;
+ queue.offer(n);
+ }
+ }
+ }
+ }
+
+
+ }
+
+}
\ No newline at end of file
diff --git "a/d0806/\353\257\270\353\241\234\355\203\220\354\203\211.java" "b/d0806/\353\257\270\353\241\234\355\203\220\354\203\211.java"
new file mode 100644
index 0000000..488d2fc
--- /dev/null
+++ "b/d0806/\353\257\270\353\241\234\355\203\220\354\203\211.java"
@@ -0,0 +1,61 @@
+// https://www.acmicpc.net/problem/2178
+// 미로탐색
+// 12276kb, 96ms
+
+import java.io.*;
+import java.util.*;
+
+public class 미로탐색 {
+
+ public static void main(String[] args) throws Exception {
+ System.setIn(new FileInputStream("input.txt"));
+ BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+ StringTokenizer st = new StringTokenizer(br.readLine());
+
+ int N = Integer.parseInt(st.nextToken());
+ int M = Integer.parseInt(st.nextToken());
+
+ boolean[][] maze = new boolean[N+2][M+2];
+ int[][] distance = new int[N+2][M+2];
+
+ for (int i=0; i queue = new LinkedList<>();
+ queue.offer(1);
+ queue.offer(1);
+ distance[1][1] = 1;
+
+ while (!queue.isEmpty()) {
+ int x = queue.poll();
+ int y = queue.poll();
+
+ if (x == M && y == N) {
+ System.out.println(distance[y][x]);
+ return;
+ }
+
+ for (int i=0; i<4; i++) {
+ int nx = x+dx[i];
+ int ny = y+dy[i];
+ if (maze[ny][nx] && distance[ny][nx] == 0) {
+ queue.offer(nx);
+ queue.offer(ny);
+ distance[ny][nx] = distance[y][x] + 1;
+ }
+
+ }
+ }
+
+ }
+
+}
\ No newline at end of file
diff --git "a/d0806/\354\212\244\355\203\235\354\210\230\354\227\264.java" "b/d0806/\354\212\244\355\203\235\354\210\230\354\227\264.java"
new file mode 100644
index 0000000..2c8d177
--- /dev/null
+++ "b/d0806/\354\212\244\355\203\235\354\210\230\354\227\264.java"
@@ -0,0 +1,47 @@
+import java.util.*;
+import java.io.*;
+
+public class 스택수열 {
+
+ public static void main(String[] args) throws Exception{
+ System.setIn(new FileInputStream("C:\\Users\\user\\Documents\\CAREER\\SSAFY\\Algorithms\\input.txt"));
+ BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+ StringBuilder sb = new StringBuilder();
+
+ int n = Integer.parseInt(br.readLine());
+ int[] sequence = new int[n];
+
+ for (int i=0; i stack = new Stack<>();
+
+ int sPointer = 0;
+ for (int i=1; i<=n; i++) {
+ // 스택의 꼭대기가 수열의 다음과 맞는지 확인
+ while (!stack.isEmpty() && stack.peek() == sequence[sPointer]) {
+ stack.pop();
+ sPointer++;
+ sb.append("-").append("\n");
+ }
+
+ stack.add(i);
+ sb.append("+").append("\n");
+ }
+
+ while (!stack.isEmpty() && stack.peek() == sequence[sPointer]) {
+ stack.pop();
+ sPointer++;
+ sb.append("-").append("\n");
+ }
+
+ if (stack.isEmpty()) {
+ System.out.println(sb.toString());
+ } else {
+ System.out.println("NO");
+ }
+
+ }
+
+}
diff --git "a/d0808/\355\212\270\353\246\254\354\231\200\354\277\274\353\246\254.java" "b/d0808/\355\212\270\353\246\254\354\231\200\354\277\274\353\246\254.java"
new file mode 100644
index 0000000..e608d0f
--- /dev/null
+++ "b/d0808/\355\212\270\353\246\254\354\231\200\354\277\274\353\246\254.java"
@@ -0,0 +1,5 @@
+package d0808;
+
+public class 트리와쿼리 {
+
+}
diff --git "a/d0808/\355\212\270\353\246\254\354\235\230\353\266\200\353\252\250\354\260\276\352\270\260.java" "b/d0808/\355\212\270\353\246\254\354\235\230\353\266\200\353\252\250\354\260\276\352\270\260.java"
new file mode 100644
index 0000000..13eef9a
--- /dev/null
+++ "b/d0808/\355\212\270\353\246\254\354\235\230\353\266\200\353\252\250\354\260\276\352\270\260.java"
@@ -0,0 +1,62 @@
+package d0808;
+
+import java.util.*;
+import java.io.*;
+
+public class 트리의부모찾기 {
+
+ public static void main(String[] args) throws Exception{
+ System.setIn(new FileInputStream("C:\\Users\\user\\Documents\\CAREER\\SSAFY\\Algorithms\\input.txt"));
+ BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+ BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
+ StringTokenizer st = null;
+ StringBuilder sb = new StringBuilder();
+
+
+ int n = Integer.parseInt(br.readLine());
+
+ Map> graph = new HashMap<>();
+
+ for (int i=1; i<=n; i++) {
+ graph.put(i, new ArrayList());
+ }
+
+ boolean[] visited = new boolean[n+1];
+ int[] ans = new int[n+1];
+
+ for(int i=0; i q = new ArrayDeque<>();
+ q.add(1);
+
+ while (!q.isEmpty()) {
+ int cur = q.poll();
+ visited[cur] = true;
+ for(int i: graph.get(cur)) {
+ if (!visited[i]){
+ q.add(i);
+ ans[i] = cur;
+ }
+ }
+ }
+ //끝
+
+ for(int i=2; i<=n; i++) {
+ sb.append(ans[i]).append("\n");
+ }
+
+ bw.write(sb.toString());
+ bw.flush();
+ }
+
+}
diff --git "a/d0812/\354\232\260\354\210\230\353\247\210\354\235\204.java" "b/d0812/\354\232\260\354\210\230\353\247\210\354\235\204.java"
new file mode 100644
index 0000000..ee53ac0
--- /dev/null
+++ "b/d0812/\354\232\260\354\210\230\353\247\210\354\235\204.java"
@@ -0,0 +1,67 @@
+// https://www.acmicpc.net/problem/1949
+
+package d0812;
+
+import java.io.*;
+import java.util.*;
+
+
+// memory 22192, time 208ms
+public class 우수마을 {
+
+ private static HashMap> graph = new HashMap<>();
+ private static int[][] memo;
+ private static int[] people;
+ private static boolean[] visited;
+ private static int n;
+
+ public static void main(String[] args) throws Exception {
+
+ System.setIn(new FileInputStream("input.txt"));
+ BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+ StringTokenizer st = null;
+
+ n = Integer.parseInt(br.readLine());
+ people = new int[n+1];
+ visited = new boolean[n+1];
+ memo = new int[n+1][2];
+
+ // 도시 인구수 저장
+ st = new StringTokenizer(br.readLine());
+ for (int i=1; i<=n; i++) {
+ people[i] = Integer.parseInt(st.nextToken());
+ graph.put(i, new ArrayList());
+ }
+
+ // 트리 저장
+ for (int i=1; i next = graph.get(cur);
+ visited[cur] = true;
+
+ for (int city: next) {
+ if (!visited[city]) {
+ dfs(city);
+
+ memo[cur][0] += memo[city][1]; // 선택
+ memo[cur][1] += Math.max(memo[city][0], memo[city][1]); // 미선택
+ }
+ }
+ memo[cur][0] += people[cur];
+ }
+
+}
\ No newline at end of file
diff --git "a/d0812/\355\212\270\353\246\254.java" "b/d0812/\355\212\270\353\246\254.java"
new file mode 100644
index 0000000..0deb2ec
--- /dev/null
+++ "b/d0812/\355\212\270\353\246\254.java"
@@ -0,0 +1,66 @@
+// https://www.acmicpc.net/problem/1068
+package d0812;
+
+import java.io.*;
+import java.util.*;
+
+// memory 11605kb time 80ms
+public class 트리 {
+
+ private static List> graph = new ArrayList<>();
+ private static int root, leaves, ignore;
+
+ public static void main(String[] args) throws Exception {
+
+ System.setIn(new FileInputStream("input.txt"));
+ BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+
+ int n = Integer.parseInt(br.readLine());
+
+ StringTokenizer st = new StringTokenizer(br.readLine());
+
+ // 그래프 초기화
+ for (int i=0; i());
+ }
+
+ // 그래프 입력
+ for (int i=0; i children = graph.get(cur);
+ if (children.size() == 0) {
+ leaves++;
+ } else {
+ for (int child: children) {
+ if (child == ignore) {
+ if (children.size() == 1) leaves++;
+ } else {
+ countLeaves(child);
+ }
+ }
+ }
+ }
+
+}
\ No newline at end of file
diff --git "a/d0812/\355\215\274\354\246\220.java" "b/d0812/\355\215\274\354\246\220.java"
new file mode 100644
index 0000000..6548c96
--- /dev/null
+++ "b/d0812/\355\215\274\354\246\220.java"
@@ -0,0 +1,108 @@
+// https://www.acmicpc.net/problem/1525
+
+package d0812;
+
+import java.io.*;
+import java.util.*;
+
+// memory 118480kb time 1016ms
+public class 퍼즐 {
+
+ private static String goal;
+ private static String curState;
+ private static HashMap memo = new HashMap<>();
+
+ public static void main(String[] args) throws Exception {
+ System.setIn(new FileInputStream("input.txt"));
+ BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+
+ StringBuilder goalbuilder = new StringBuilder();
+ for(int i=0; i<3; i++) {
+ StringTokenizer st = new StringTokenizer(br.readLine());
+ for(int j=0; j<3; j++) {
+ goalbuilder.append(st.nextToken());
+ }
+ }
+ goal = goalbuilder.toString();
+
+ // bfs로 풀어보기
+ Queue q = new ArrayDeque<>();
+ String firstState = "123456780";
+ q.add(firstState);
+ memo.put(firstState, 0);
+
+
+ int[] dr = {-1, 1, 0, 0};
+ int[] dc = {0, 0, 1, -1};
+ int steps = 1;
+
+ while (!q.isEmpty()) {
+ curState = q.poll();
+ steps = memo.get(curState)+1;
+ if (curState.equals(goal)) {
+ System.out.println(memo.get(goal));
+ return;
+ }
+
+
+ int[][] curArr = buildArr(curState);
+
+ // 4방향으로 bfs
+ for (int r=0; r<3; r++) {
+ for (int c=0; c<3; c++) {
+ if (curArr[r][c] == 0) {
+ for (int k=0; k<4; k++) {
+ int nr = r + dr[k];
+ int nc = c + dc[k];
+ if (nr >= 0 && nc >= 0 && nr < 3 && nc <3) {
+ // swapping
+ curArr[r][c] = curArr[nr][nc];
+ curArr[nr][nc] = 0;
+ String nextArr = buildString(curArr);
+ if (memo.get(nextArr) == null || memo.get(nextArr) > steps) {
+ q.add(nextArr);
+ memo.put(nextArr, steps);
+ }
+ // swap back
+ curArr[nr][nc] = curArr[r][c];
+ curArr[r][c] = 0;
+ }
+ }
+ }
+ }
+ }
+
+ }
+
+ if (memo.get(goal) == null) {
+ System.out.println("-1");
+ }
+
+ }
+
+ private static int[][] buildArr(String str2copy) {
+ int[][] resarr = new int[3][3];
+
+ for (int r=0; r<3; r++) {
+ for (int c=0; c<3; c++) {
+ resarr[r][c] = str2copy.charAt(r*3 + c) - '0';
+ }
+ }
+
+ return resarr;
+ }
+
+ // 스트링 만들기
+ private static String buildString(int[][] arr2copy) {
+ StringBuilder arrbuilder = new StringBuilder();
+
+ for(int i=0; i<3; i++) {
+ for(int j=0; j<3; j++) {
+ arrbuilder.append(arr2copy[i][j]);
+ }
+ }
+
+ return arrbuilder.toString();
+ }
+
+}
\ No newline at end of file
diff --git "a/d0815/\352\262\214\354\236\204\354\235\204\353\247\214\353\223\240\353\217\231\354\244\200\354\235\264.java" "b/d0815/\352\262\214\354\236\204\354\235\204\353\247\214\353\223\240\353\217\231\354\244\200\354\235\264.java"
new file mode 100644
index 0000000..9789afe
--- /dev/null
+++ "b/d0815/\352\262\214\354\236\204\354\235\204\353\247\214\353\223\240\353\217\231\354\244\200\354\235\264.java"
@@ -0,0 +1,46 @@
+// https://www.acmicpc.net/problem/2847
+
+package d0815;
+
+import java.io.*;
+
+public class 게임을만든동준이 {
+
+ static int[] cookies;
+ static int left, right, c;
+ static int n, m, answer;
+
+ public static void main(String[] args) throws Exception {
+
+ System.setIn(new FileInputStream("input.txt"));
+ BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+
+ int n = Integer.parseInt(br.readLine());
+
+ if (n==1) {
+ System.out.println(0);
+ return;
+ }
+
+ int[] points = new int[n]; // 레벨 점수 담은 배열
+
+ for (int i=0; i=0; i--) {
+ if (points[i] < prevLev) {
+ prevLev = points[i];
+ continue;
+ }
+ prevLev = prevLev-1;
+ res += points[i] - prevLev;
+ }
+
+ System.out.println(res);
+ }
+
+}
\ No newline at end of file
diff --git "a/d0815/\352\263\274\354\236\220\353\202\230\353\210\240\354\243\274\352\270\260.java" "b/d0815/\352\263\274\354\236\220\353\202\230\353\210\240\354\243\274\352\270\260.java"
new file mode 100644
index 0000000..37cbc0e
--- /dev/null
+++ "b/d0815/\352\263\274\354\236\220\353\202\230\353\210\240\354\243\274\352\270\260.java"
@@ -0,0 +1,64 @@
+// https://www.acmicpc.net/problem/16401
+package d0815;
+
+import java.io.*;
+import java.util.*;
+
+// memory 169628kb time 1004ms
+public class 과자나눠주기 {
+
+ static int[] cookies;
+ static int left, right, c;
+ static int n, m, answer;
+
+ public static void main(String[] args) throws Exception {
+
+ System.setIn(new FileInputStream("input.txt"));
+ BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+ StringTokenizer st = new StringTokenizer(br.readLine());
+
+ m = Integer.parseInt(st.nextToken());
+ n = Integer.parseInt(st.nextToken());
+
+ cookies = new int[n];
+ st = new StringTokenizer(br.readLine());
+ for (int i=0; i=0; i--) {
+ count += cookies[i]/c;
+ if (count >= m) {
+ left = c+1;
+ answer = c;
+ return;
+ }
+ if (cookies[i] < c && count < m) {
+ right = c-1;
+ return;
+ }
+ }
+ if (count >= m) { // m = 조카 수
+ left = c+1;
+ answer = c;
+ } else {
+ right = c-1;
+ }
+ }
+
+}
\ No newline at end of file
diff --git "a/d0818/\355\203\200\352\262\237\353\204\230\353\262\204.java" "b/d0818/\355\203\200\352\262\237\353\204\230\353\262\204.java"
new file mode 100644
index 0000000..f35a088
--- /dev/null
+++ "b/d0818/\355\203\200\352\262\237\353\204\230\353\262\204.java"
@@ -0,0 +1,30 @@
+package d0818;
+
+class 타겟넘버 {
+ static int answer;
+ static int n;
+
+ public static int solution(int[] numbers, int target) {
+ answer = 0;
+ n = numbers.length;
+
+ dfs(0, 0, numbers, target);
+
+ return answer;
+ }
+
+ private static void dfs(int cnt, int cursum, int[] numbers, int target) {
+ if (cnt == n) {
+ if (cursum == target) answer++;
+ return;
+ }
+
+ dfs(cnt+1, cursum+numbers[cnt], numbers, target); // 더하기
+ dfs(cnt+1, cursum-numbers[cnt], numbers, target); // 빼기
+
+ }
+
+ public static void main(String[] args) {
+ System.out.println(solution(new int[] {1,1,1,1,1}, 3));
+ }
+}
diff --git a/d0822/bj14940.class b/d0822/bj14940.class
new file mode 100644
index 0000000..fb14a7c
Binary files /dev/null and b/d0822/bj14940.class differ
diff --git a/d0822/bj14940.java b/d0822/bj14940.java
new file mode 100644
index 0000000..2cbd783
--- /dev/null
+++ b/d0822/bj14940.java
@@ -0,0 +1,81 @@
+// package d0822;
+
+import java.io.*;
+import java.util.*;
+
+public class bj14940 {
+
+ static int[][] map, answer;
+ static boolean[][] visited;
+ static int n, m;
+ static int[] start = new int[3];
+ static final int[] dr = {1, -1, 0, 0};
+ static final int[] dc = {0, 0, 1, -1};
+
+ public static void main(String[] args) throws Exception{
+ System.setIn(new FileInputStream("../input.txt"));
+ BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+ StringTokenizer st = new StringTokenizer(br.readLine());
+
+ // System.out.println("test");
+
+ n = Integer.parseInt(st.nextToken());
+ m = Integer.parseInt(st.nextToken());
+ map = new int[n][m];
+ answer = new int[n][m];
+ visited = new boolean[n][m];
+
+ // input
+ for (int i=0; i q = new ArrayDeque<>();
+ q.add(start);
+ visited[start[0]][start[1]] = true;
+
+ while (!q.isEmpty()) {
+ int[] cur = q.poll();
+ answer[cur[0]][cur[1]] = cur[2]; //count 저장
+ for (int i=0; i<4; i++) {
+ int nr = cur[0] + dr[i];
+ int nc = cur[1] + dc[i];
+ if (inRange(nr, nc) && !visited[nr][nc] && map[nr][nc] == 1) {
+ visited[nr][nc] = true;
+ q.add(new int[] {nr, nc, cur[2]+1});
+ }
+ }
+ }
+ StringBuilder sb = new StringBuilder();
+
+ for (int i=0; i= 0 && col >= 0 && row < n && col < m) {
+ return true;
+ }
+ return false;
+ }
+
+}
diff --git "a/d0822/\355\206\240\353\247\210\355\206\240.java" "b/d0822/\355\206\240\353\247\210\355\206\240.java"
new file mode 100644
index 0000000..6bedc27
--- /dev/null
+++ "b/d0822/\355\206\240\353\247\210\355\206\240.java"
@@ -0,0 +1,82 @@
+// https://www.acmicpc.net/problem/7576
+
+import java.io.*;
+import java.util.*;
+
+public class 토마토 {
+
+ static int m, n;
+ static int[][] map;
+ static boolean[][] visited;
+ static List start;
+
+ public static void main(String[] args) throws Exception {
+ // 시작부터 모두 익은 경우
+ // 마지막까지 모두 악지 못하는 경우
+ System.setIn(new FileInputStream("input.txt"));
+ BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+ StringTokenizer st = new StringTokenizer(br.readLine());
+
+ m = Integer.parseInt(st.nextToken());
+ n = Integer.parseInt(st.nextToken());
+
+ map = new int[n][m];
+ visited = new boolean[n][m];
+ start = new ArrayList();
+
+ //배열 입력
+ boolean seenEmpty = false;
+ for(int i=0; i q = new ArrayDeque<>();
+ for (int[] s: start) {
+ q.offer(s);
+ visited[s[0]][s[1]] = true;
+ }
+
+ int[] dr = {1, -1, 0, 0};
+ int[] dc = {0, 0, 1, -1};
+ int days = 0;
+
+ while(!q.isEmpty()) {
+ int[] cur = q.poll();
+ if (cur[2] > days) days = cur[2];
+ for (int i=0; i<4; i++) {
+ int nr = cur[0] + dr[i];
+ int nc = cur[1] + dc[i];
+ if (nr >= 0 && nc >= 0 && nr < n && nc < m && !visited[nr][nc] && map[nr][nc] == 0) {
+ visited[nr][nc] = true;
+ q.offer(new int[] {nr, nc, cur[2]+1});
+ }
+ }
+ }
+
+ // 앞뒤로 확인
+ for (int i=0; i=0; i--) {
+ int time = session[i][0];
+ int payment = session[i][1];
+ if (i + time <= n) { // 퇴사 전에 끝낼 수 있으면
+ // 선택
+ dp[0][i] = payment + Math.max(dp[0][i+time], dp[1][i+time]);
+ }
+ // 미선택
+ dp[1][i] = Math.max(dp[0][i+1], dp[1][i+1]);
+ }
+
+ System.out.println(Math.max(dp[0][0], dp[1][0]));
+ }
+
+
+}
\ No newline at end of file
diff --git a/d0829/bj9095.java b/d0829/bj9095.java
new file mode 100644
index 0000000..47961c8
--- /dev/null
+++ b/d0829/bj9095.java
@@ -0,0 +1,37 @@
+// https://www.acmicpc.net/problem/9095
+
+package d0829;
+
+import java.io.*;
+import java.util.*;
+
+public class bj9095 {
+ public static void main(String[] args) throws Exception {
+ System.setIn(new FileInputStream("input.txt"));
+ BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+ BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
+
+
+ int n = Integer.parseInt(br.readLine());
+ int nums[] = new int[n];
+
+ for(int i=0; i{
+ int to, weight;
+ public Edge (int to, int weight) {
+ this.to = to;
+ this.weight = weight;
+ }
+
+ @Override
+ public int compareTo(Edge o) {
+ return Integer.compare(this.weight, o.weight);
+ }
+
+ @Override
+ public String toString() {
+ return to + " " + weight;
+ }
+ }
+
+ public static void main(String[] args) throws Exception {
+ BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); // 빠른 읽기
+ StringTokenizer st = new StringTokenizer(br.readLine()); // 문자열 줄로 읽어 빠르게 토큰으로 나누기
+
+ int n = Integer.parseInt(st.nextToken());
+ int m = Integer.parseInt(st.nextToken());
+ int x = Integer.parseInt(st.nextToken());
+
+ List> graph = new ArrayList<>();
+ List> graph2 = new ArrayList<>();
+ for (int i=0; i<=n; i++) {
+ graph.add(new ArrayList<>());
+ graph2.add(new ArrayList<>());
+ }
+
+ for (int i=0; i pq = new PriorityQueue<>();
+ pq.offer(new Edge(x, 0));
+
+ while(!pq.isEmpty()) {
+ Edge cur = pq.poll();
+ if (visited[cur.to]) continue; // 이미 방문했으면 다음 작은 엣지
+ visited[cur.to] = true;
+ for(Edge e: graph.get(cur.to)) {
+ if (!visited[e.to] && toHome[e.to] > toHome[cur.to] + e.weight ) {
+ toHome[e.to] = toHome[cur.to] + e.weight;
+ pq.offer(new Edge(e.to, toHome[e.to]));
+ }
+ }
+ }
+
+ // 각 집에서 파티가는길
+ pq = new PriorityQueue<>();
+ pq.offer(new Edge(x, 0));
+
+ while(!pq.isEmpty()) {
+ Edge cur = pq.poll();
+ if (visited2[cur.to]) continue; // 이미 방문했으면 다음 작은 엣지
+ visited2[cur.to] = true;
+// System.out.println(graph.get(cur.to));
+ for(Edge e: graph2.get(cur.to)) {
+ if (!visited2[e.to] && toParty[e.to] > toParty[cur.to] + e.weight ) {
+ toParty[e.to] = toParty[cur.to] + e.weight;
+ pq.offer(new Edge(e.to, toParty[e.to]));
+ }
+ }
+ }
+
+ int taxiB = 0;
+ for (int i=1; i<=n; i++) {
+ int poten = toHome[i] + toParty[i];
+ if (poten > taxiB) taxiB = poten;
+ }
+
+ System.out.println(taxiB);
+ }
+
+}
\ No newline at end of file
diff --git a/d0909/bj18111.java b/d0909/bj18111.java
new file mode 100644
index 0000000..ebc9235
--- /dev/null
+++ b/d0909/bj18111.java
@@ -0,0 +1,63 @@
+// 백준 마인크래프트
+package d0909;
+
+import java.io.*;
+import java.util.*;
+
+public class bj18111 {
+
+ public static void main(String[] args) throws Exception {
+ BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); // 빠른 읽기
+ StringTokenizer st = new StringTokenizer(br.readLine()); // 문자열 줄로 읽어 빠르게 토큰으로 나누기
+
+ int n = Integer.parseInt(st.nextToken());
+ int m = Integer.parseInt(st.nextToken());
+ int b = Integer.parseInt(st.nextToken());
+
+ int[][] soil = new int[n][m];
+
+ for (int i=0; i 0) tmptime += dig*2; // positive means dig
+ else if (dig < 0) tmptime += Math.abs(dig); // negative means fill
+ blocks += dig;
+ }
+ }
+
+ // if remaining blocks > map size
+ // meaning we dug too much
+ // we should dig less
+ // min = mid + 1
+ // if not enough blocks
+ // impossible, cannot Rill that much
+ // need to dig more
+ // max = mid - 1
+ if (blocks >= 0) {
+ if (tmptime <= time) {
+ time = tmptime;
+ level = mid;
+ }
+ }
+
+ }
+
+ //출력
+ System.out.println(time + " " + level);
+
+ }
+
+}
\ No newline at end of file
diff --git a/d0909/bj2206.java b/d0909/bj2206.java
new file mode 100644
index 0000000..f93f6e1
--- /dev/null
+++ b/d0909/bj2206.java
@@ -0,0 +1,82 @@
+package d0909;
+import java.io.*;
+import java.util.*;
+
+public class bj2206 {
+
+ public static void main(String[] args) throws Exception {
+ BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); // 빠른 읽기
+ StringTokenizer st = new StringTokenizer(br.readLine()); // 문자열 줄로 읽어 빠르게 토큰으로 나누기
+
+ int n = Integer.parseInt(st.nextToken());
+ int m = Integer.parseInt(st.nextToken());
+
+ int map[][] = new int[n][m];
+ int dp1[][] = new int[n][m];
+ int dp2[][] = new int[n][m];
+ dp1[0][0] = 1;
+
+ for (int i=0; i q = new ArrayDeque<>();
+ q.offer(new int[] {0,0,0}); // [x,y,벽(0=안부숨, 1=부숨)]
+
+ int[] dr = {1, -1, 0, 0};
+ int[] dc = {0, 0, 1, -1};
+ boolean[][] visited1 = new boolean[n][m];
+ boolean[][] visited2 = new boolean[n][m];
+ visited1[0][0] = true;
+
+ while (!q.isEmpty()) {
+ int r = q.peek()[0];
+ int c = q.peek()[1];
+ int broken = q.peek()[2];
+ q.poll();
+
+ // 4방향 확인
+ for (int i=0; i<4; i++) {
+ int nr = r + dr[i];
+ int nc = c + dc[i];
+
+ // 범위 안에 없으거나 방문했으면 다음
+ if (!(nr >= 0 && nc >= 0 && nr < n && nc < m)) continue;
+ // 벽 없으면 다음 위치 dp 값 업데이트, 큐에 추가
+ if (map[nr][nc] == 0) {
+ // 벽 아직 안부쉈으면
+ if (broken == 0 && !visited1[nr][nc]) {
+ visited1[nr][nc] = true;
+ dp1[nr][nc] = dp1[r][c] + 1;
+ q.offer(new int[] {nr, nc, 0});
+ } else if (broken == 1 && !visited2[nr][nc]) { // 벽 이미 부순 상태면
+ visited2[nr][nc] = true;
+ dp2[nr][nc] = dp2[r][c] + 1;
+ q.offer(new int[] {nr, nc, 1});
+ }
+ // 벽 있고 아직 벽을 안부숴봤으면
+ } else if (broken == 0 && !visited1[nr][nc]) {
+ visited1[nr][nc] = true;
+ dp2[nr][nc] = dp1[r][c] + 1;
+ q.offer(new int[] {nr, nc, 1});
+ }
+ }
+ }
+
+ if (dp1[n-1][m-1] == 0 && dp2[n-1][m-1] == 0) {
+ System.out.println(-1);
+ } else if (dp1[n-1][m-1] == 0) {
+ System.out.println(dp2[n-1][m-1]);
+ } else if (dp2[n-1][m-1] == 0) {
+ System.out.println(dp1[n-1][m-1]);
+ } else {
+ System.out.println(Math.min(dp1[n-1][m-1], dp2[n-1][m-1]));
+ }
+
+ }
+
+}
\ No newline at end of file
diff --git a/d0909/bj4949.java b/d0909/bj4949.java
new file mode 100644
index 0000000..82489cb
--- /dev/null
+++ b/d0909/bj4949.java
@@ -0,0 +1,55 @@
+package d0909;
+
+import java.io.*;
+import java.util.*;
+
+public class bj4949 {
+ public static void main(String[] args) throws Exception {
+ System.setIn(new FileInputStream("input.txt"));
+ BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); // 빠른 읽기
+ BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
+ StringBuilder sb = new StringBuilder();
+
+ String s = br.readLine();
+
+ while (!s.equals(".")) {
+ int n = s.length();
+ Stack stack = new Stack<>();
+ boolean match = true;
+ for (int i=0; i order = new HashMap<>();
+
+ for (int i=0; i similar = new ArrayList<>();
+ int length = 0;
+ String common = "";
+
+ for (int i=0; i length) {
+ length = tmpcnt;
+ common = sb.toString();
+ similar.clear();
+ similar.add(s1);
+ similar.add(s2);
+ } else if (tmpcnt == length) {
+ if (common.contentEquals(sb)) {
+ similar.add(s2);
+ } else {
+ int porder = n;
+ for (String s: similar) {
+ porder = Math.min(porder, order.get(s));
+ }
+ int norder = Math.min(order.get(s1), order.get(s2));
+ if (norder order.get(e1) - order.get(e2));
+ System.out.println(similar.get(0) + "\n" + similar.get(1));
+ }
+// System.out.println(common);
+
+ }
+
+}
\ No newline at end of file
diff --git a/d0916/bj7569.java b/d0916/bj7569.java
new file mode 100644
index 0000000..f0503a9
--- /dev/null
+++ b/d0916/bj7569.java
@@ -0,0 +1,74 @@
+package d0916;
+
+import java.io.*;
+import java.util.*;
+
+public class bj7569 {
+ public static void main(String[] args) throws Exception {
+ System.setIn(new FileInputStream("input.txt"));
+ BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); // 빠른 읽기
+
+ StringTokenizer st = new StringTokenizer(br.readLine());
+ int m = Integer.parseInt(st.nextToken());
+ int n = Integer.parseInt(st.nextToken());
+ int h = Integer.parseInt(st.nextToken());
+
+ int[][][] tomato = new int[h][n][m];
+ Queue q = new ArrayDeque<>();
+ boolean allripe = true;
+ for (int i=0; i= m || ny < 0 || ny >= n || nz < 0 || nz >= h || tomato[nz][ny][nx] != 0) continue;
+ tomato[nz][ny][nx] = tomato[z][y][x] + 1;
+ q.offer(new int[] {nx, ny, nz});
+ }
+ }
+
+ int days = 0;
+ for (int i=0; i days) days = tomato[i][j][k];
+ }
+ }
+ }
+ System.out.println(days-1);
+ }
+
+}
\ No newline at end of file
diff --git a/d0923/bj08428.java b/d0923/bj08428.java
new file mode 100644
index 0000000..842bd12
--- /dev/null
+++ b/d0923/bj08428.java
@@ -0,0 +1,89 @@
+package d0923;
+
+import java.io.*;
+import java.util.*;
+
+public class bj08428 {
+
+ static int n;
+ static int[][] map;
+ static List students = new ArrayList<>();
+ static List teachers = new ArrayList<>();
+ public static void main(String[] args) throws Exception {
+ System.setIn(new FileInputStream("input.txt"));
+ BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); // 빠른 읽기
+ StringTokenizer st = null;
+
+ n = Integer.parseInt(br.readLine());
+ map = new int[n][n];
+
+ for (int i=0;i startPoint = null;
+ int find = -1;
+ if (students.size() <= teachers.size()) {
+ startPoint = students;
+ find = 2;
+ } else {
+ startPoint = teachers;
+ find = 1;
+ }
+
+ // 3중 루프해서 빈칸의 모든 조합에 벽을 세워서 확인
+ for (int i=0; i startPoint, int find) {
+ int[] dr = {1, -1, 0, 0};
+ int[] dc = {0, 0, 1, -1};
+
+ for (int[] p: startPoint) {
+ int r = p[0];
+ int c = p[1];
+ for (int i=0; i<4; i++) {
+ int nr = r + dr[i];
+ int nc = c + dc[i];
+ while (nr >= 0 && nc >= 0 && nr < n && nc < n && map[nr][nc] != -1) { // 범위 안에 있으면
+ if (map[nr][nc] == find) return false;
+ nr += dr[i];
+ nc += dc[i];
+ }
+ }
+ }
+
+ return true;
+ }
+
+}
\ No newline at end of file
diff --git a/d0930/bj16928.java b/d0930/bj16928.java
new file mode 100644
index 0000000..457a948
--- /dev/null
+++ b/d0930/bj16928.java
@@ -0,0 +1,103 @@
+package d0930;
+
+import java.io.*;
+import java.util.*;
+
+
+public class bj16928 { // 80ms
+ public static void main(String[] args) throws Exception {
+ // 참고 솔루션
+ System.setIn(new FileInputStream("input.txt"));
+ BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); // 빠른 읽기
+ StringTokenizer st = new StringTokenizer(br.readLine());
+
+ int n = Integer.parseInt(st.nextToken());
+ int m = Integer.parseInt(st.nextToken());
+
+ HashMap slide = new HashMap<>();
+
+ for (int i=0; i q = new ArrayDeque<>();
+ q.offer(new int[] {1, 0});
+
+ while(!q.isEmpty()) {
+ int cur = q.peek()[0];
+ int cnt = q.peek()[1];
+ q.poll();
+ for (int i=1; i<=6; i++) {
+ int nx = cur + i;
+ if (nx == 100) {
+ System.out.println(cnt+1);
+ return;
+ } else if (nx < 100) {
+ while (slide.containsKey(nx)) {
+ nx = slide.get(nx);
+ }
+ if (!visited[nx]) { // 안가봤으면
+ visited[nx] = true;
+ q.offer(new int[] {nx, cnt+1});
+ }
+ }
+ }
+ }
+
+
+ }
+
+ // 내 솔루션 수정
+// public class Main{
+// public static void main(String[] args) throws Exception {
+// BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); // 빠른 읽기
+// StringTokenizer st = new StringTokenizer(br.readLine());
+//
+// int n = Integer.parseInt(st.nextToken());
+// int m = Integer.parseInt(st.nextToken());
+//
+// HashMap ladder = new HashMap<>();
+// HashMap snake = new HashMap<>();
+//
+// for (int i=0; i q = new ArrayDeque<>();
+// q.offer(1);
+//
+// while(!q.isEmpty()) {
+// int cur = q.poll();
+// for (int i=1; i<=6; i++) {
+// int next = cur + i;
+// if (next == 100) {
+// System.out.println(dp[cur] + 1);
+// return;
+// }
+// if (ladder.containsKey(next)) {
+// next = ladder.get(next);
+// } else if (snake.containsKey(next)) {
+// next = snake.get(next);
+// }
+// if (dp[next] == 0) { // 안가본데 확인
+// dp[next] = dp[cur] + 1;
+// q.offer(next);
+// }
+// }
+// }
+// }
+//
+// }
+
+}
diff --git a/d1007/bj1174.java b/d1007/bj1174.java
new file mode 100644
index 0000000..7c3ecdc
--- /dev/null
+++ b/d1007/bj1174.java
@@ -0,0 +1,64 @@
+package d1007;
+
+import java.util.*; // 자료구조 등 위해
+import java.io.*; // 테스트케이스 입출력 위해
+
+public class bj1174 { // 클래스 정의 시작
+
+ static List decreasing = new ArrayList<>();
+ static ArrayDeque combStack = new ArrayDeque<>();
+ static boolean[] visited = new boolean[10];
+
+
+ public static void main(String[] args) throws Exception { // 메인 메서드 시작
+ BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); // 입력 빠르게 읽기
+
+ int n = Integer.parseInt(br.readLine());
+
+ if (n >= 1024) {
+ System.out.println(-1);
+ return;
+ }
+
+ // 자리수 별로 조합 만들기
+ for (int i=1; i<=10; i++) {
+ dfs(0, 0, i);
+ }
+
+ Collections.sort(decreasing);
+ System.out.println(decreasing.get(n-1));
+
+ }
+
+
+ // idx 이전 자리수의 값 - 여기부터 시작해서 큰수만 추가
+ // cnt 현재까지 채운 자리수
+ // lim 채워야할 자리수
+ static void dfs(int idx, int cnt, int lim) {
+
+ if (cnt == lim) {
+ long tmp = 0;
+ for (int x: combStack) {
+ tmp += x;
+ tmp *= 10;
+ }
+ tmp /= 10;
+ decreasing.add(tmp);
+ return;
+ }
+
+ for (int i=idx; i<10; i++) {
+ if (!visited[i]) {
+ visited[i] = true;
+ combStack.offerFirst(i);
+ dfs(i+1, cnt+1, lim);
+ combStack.pollFirst();
+ visited[i] = false;
+ }
+
+ }
+
+
+ }
+
+}
\ No newline at end of file
diff --git a/d1007/bj1655.java b/d1007/bj1655.java
new file mode 100644
index 0000000..ef098d4
--- /dev/null
+++ b/d1007/bj1655.java
@@ -0,0 +1,50 @@
+package d1007;
+
+import java.util.*; // 자료구조 등 위해
+import java.io.*; // 테스트케이스 입출력 위해
+
+public class bj1655 { // 클래스 정의 시작
+
+ public static void main(String[] args) throws Exception { // 메인 메서드 시작
+ BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); // 입력 빠르게 읽기
+ BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
+ StringBuilder sb = new StringBuilder(); // 문자열 모아서 출력
+ StringTokenizer st = new StringTokenizer(br.readLine());
+
+ int n = Integer.parseInt(st.nextToken());
+
+ PriorityQueue minHeap = new PriorityQueue<>();
+ PriorityQueue maxHeap = new PriorityQueue<>(Collections.reverseOrder());
+
+ maxHeap.offer(Integer.parseInt(br.readLine()));
+ int mid = maxHeap.peek();
+ sb.append(mid).append("\n");
+ for (int i=1; i mid) {
+ minHeap.add(next);
+ } else {
+ maxHeap.add(next);
+ }
+
+ // balance heap
+ if (minHeap.size() > maxHeap.size()) {
+ maxHeap.offer(minHeap.poll());
+ } else if (maxHeap.size() > minHeap.size()+1) {
+ minHeap.offer(maxHeap.poll());
+ }
+
+ // update mid
+ mid = maxHeap.peek();
+ sb.append(mid).append("\n");
+
+ }
+
+ bw.write(sb.toString());
+ bw.flush();
+
+ }
+
+}
\ No newline at end of file
diff --git a/d1007/bj16928.java b/d1007/bj16928.java
new file mode 100644
index 0000000..b494e57
--- /dev/null
+++ b/d1007/bj16928.java
@@ -0,0 +1,54 @@
+package d1007;
+
+import java.io.*;
+import java.util.*;
+
+public class bj16928 {
+ public static void main(String[] args) throws Exception {
+ BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); // 빠른 읽기
+ StringTokenizer st = new StringTokenizer(br.readLine());
+
+ int n = Integer.parseInt(st.nextToken());
+ int m = Integer.parseInt(st.nextToken());
+
+ HashMap ladder = new HashMap<>();
+ HashMap snake = new HashMap<>();
+
+ for (int i=0; i q = new ArrayDeque<>();
+ q.offer(1);
+
+ while(!q.isEmpty()) {
+ int cur = q.poll();
+ for (int i=1; i<=6; i++) {
+ int next = cur + i;
+ if (next == 100) {
+ System.out.println(dp[cur] + 1);
+ return;
+ }
+ if (ladder.containsKey(next)) {
+ next = ladder.get(next);
+ } else if (snake.containsKey(next)) {
+ next = snake.get(next);
+ }
+ if (dp[next] == 0) { // 안가본데 확인
+ dp[next] = dp[cur] + 1;
+ q.offer(next);
+ }
+ }
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/d1007/bj18809.java b/d1007/bj18809.java
new file mode 100644
index 0000000..e22a2cc
--- /dev/null
+++ b/d1007/bj18809.java
@@ -0,0 +1,145 @@
+package d1007;
+
+import java.util.*; // 자료구조 등 위해
+import java.io.*; // 테스트케이스 입출력 위해
+
+public class bj18809 { // 클래스 정의 시작
+
+ static int n, m, g, r;
+ static int nfertile, flowers;
+ static int[][] map;
+ static List fertile = new ArrayList<>();
+ static int[] plant;
+ static int[] dr = {1, -1, 0, 0};
+ static int[] dc = {0, 0, 1, -1};
+
+ public static void main(String[] args) throws Exception { // 메인 메서드 시작
+ BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); // 입력 빠르게 읽기
+ StringTokenizer st = new StringTokenizer(br.readLine());
+
+ n = Integer.parseInt(st.nextToken());
+ m = Integer.parseInt(st.nextToken());
+ g = Integer.parseInt(st.nextToken());
+ r = Integer.parseInt(st.nextToken());
+
+ map = new int[n][m];
+ for (int i=0; i 조합 크기 확인용
+ plant = new int[nfertile]; // 배양액 가능한 위치에 뿌릴 색 기록용
+
+
+ // dfs로 배양액 위치 조합 생성
+ // 배양액 색 별 선택 횟수
+ dfs(0, 0, 0);
+
+ System.out.println(flowers);
+
+ }
+
+ static void dfs(int green, int red, int cnt) {
+ // 선택한 초록,빨강이 심어야하는 수보다 크면 가지치기
+ // 남은 칸에 모두 배양액 심어도 부족하면 가지치기
+ if (green > g || red > r || ((g+r) - (green + red) > (nfertile - cnt))) return; // too many of color
+
+ // 배양액 다 심었으면, 시뮬레이션
+ if (cnt == nfertile) {
+ // 선택한 초록, 빨강 수 안맞으면 리턴
+ if (green != g || red != r) return; // if color number doesn't match
+ simulate();
+ return;
+ }
+
+ // cnt가 배양액 가능한 위치 인덱스
+ // cnt에 초록, 빨강, 빈칸 중 선택한 상태에서 dfs재귀
+ // 3 green, 4 red, 1 blank
+ plant[cnt] = 3;
+ dfs(green+1, red, cnt+1);
+ plant[cnt] = 4;
+ dfs(green, red+1, cnt+1);
+ plant[cnt] = 1;
+ dfs(green, red, cnt+1);
+ }
+
+ static void simulate() {
+ // 시뮬레이션 위한 새로운 맵(시간 정보도 포함한)
+ int[][][] gstate = new int[n][m][2];
+ // 맵 복사
+ for (int i=0; i q = new ArrayDeque<>();
+ // 배양액 심기
+ for(int i=0; i= 0 && nc >= 0 && nr < n && nc < m
+ && gstate[nr][nc][0] != 0 && gstate[nr][nc][0] != 5) {
+ if (color == 3) { // green
+ if (gstate[nr][nc][0] == 4 && gstate[nr][nc][1] == time) {
+ gstate[nr][nc][0] = 5;
+ } else if (gstate[nr][nc][0] == 1) {
+ gstate[nr][nc][0] = 3;
+ gstate[nr][nc][1] = time;
+ q.offer(new int[] {nr, nc, color, time+1});
+ }
+ } else if (color == 4) { // red
+ if (gstate[nr][nc][0] == 3 && gstate[nr][nc][1] == time) {
+ gstate[nr][nc][0] = 5;
+ } else if (gstate[nr][nc][0] == 1) {
+ gstate[nr][nc][0] = 4;
+ gstate[nr][nc][1] = time;
+ q.offer(new int[] {nr, nc, color, time+1});
+ }
+ }
+ }
+ }
+
+ }
+ int flowercnt = 0;
+ // 큐 비었으면 꽃 세기
+ for (int i=0; i clothes = new HashMap<>();
+
+ for (int i=0; i= 0 && nc >= 0 && nr < n && nc srt = new TreeSet<>();
+
+ st = new StringTokenizer(br.readLine());
+
+ for (int i=0; i compress = new HashMap<>();
+ int cnt = 0;
+ for (int i: srt) {
+ compress.putIfAbsent(i, cnt);
+ cnt++;
+ }
+
+ for (int i=0; i potential;
+ static String[] words;
+ public static void main(String[] args) throws Exception {
+ System.setIn(new FileInputStream("input.txt"));
+ BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); // 빠른 읽기
+ StringTokenizer st = new StringTokenizer(br.readLine());
+
+ n = Integer.parseInt(st.nextToken());
+ k = Integer.parseInt(st.nextToken());
+
+ if (k < 5) {
+ System.out.println(0);
+ return;
+ }
+
+ k -= 5;
+
+ words = new String[n];
+ Set alpha = new HashSet<>();
+
+ for (int i=0; i(alpha);
+
+ // 가르칠 수 있는 글자수 k 보다 배울게 적을때 모든 단어 학습 가능
+ if (k > potential.size()) {
+ System.out.println(n);
+ return;
+ }
+
+ ans = 0;
+ dfs(0, 0);
+
+ System.out.println(ans);
+ }
+
+ static void dfs(int cnt, int start) {
+ if (cnt == k) {
+ int tmp = 0;
+ // 몇개 단어들 읽을 수 있는지 확인
+ for (int i=0; i q = new ArrayDeque<>();
+ q.offer(new int[] {startA[0],startA[1], startB[0], startB[1], 0});
+ int[] dr = {-1, -1, -1, 0, 0, 0, 1, 1, 1};
+ int[] dc = {-1, 0, 1, -1, 0, 1, -1, 0, 1};
+ int ans = -1;
+
+ while (!q.isEmpty()) {
+ int ra = q.peek()[0];
+ int ca = q.peek()[1];
+ int rb = q.peek()[2];
+ int cb = q.peek()[3];
+ int cnt = q.peek()[4];
+ q.poll();
+
+ if (ra == startB[0] && ca == startB[1] && rb == startA[0] && cb == startA[1]) {
+ ans = cnt;
+ break;
+ }
+
+ for (int i=0; i<9; i++) {
+ int nra = ra + dr[i];
+ int nca = ca + dc[i];
+ for (int j=0; j<9; j++) {
+ int nrb = rb + dr[j];
+ int ncb = cb + dc[j];
+
+// System.out.println(nra + " " + nca + " " + nrb + " " + ncb);
+ if (!inRange(nra, nca, nrb, ncb)) continue;
+ if (nra == nrb && nca == ncb) continue; // 서로 겹칠때
+ if (nra == rb && nca == cb && nrb == ra && ncb == ca) continue;
+ visited[nra][nca][nrb][ncb] = true;
+ q.offer(new int[] {nra, nca, nrb, ncb, cnt+1});
+ }
+ }
+
+ }
+
+ System.out.println(ans);
+ }
+
+ static boolean inRange(int r1, int c1, int r2, int c2) {
+ if (r1 >= 0 && c1 >= 0 && r2 >= 0 && c2 >= 0
+ && r1 < n && r2 < n && c1 < m && c2 < m
+ && map[r1][c1] == 0 && map[r2][c2] == 0
+ && !visited[r1][c1][r2][c2]) return true;
+ return false;
+ }
+
+}
\ No newline at end of file
diff --git a/d1030/bj2357.java b/d1030/bj2357.java
new file mode 100644
index 0000000..a7dcd79
--- /dev/null
+++ b/d1030/bj2357.java
@@ -0,0 +1,87 @@
+package d1030;
+
+import java.io.*;
+import java.util.*;
+
+public class bj2357 {
+
+ static class Node {
+ int mini, maxi;
+ Node(){}
+ Node(int mini, int maxi) {
+ this.mini = mini;
+ this.maxi = maxi;
+ }
+ }
+
+ static int n, m;
+ static int[] arr;
+ static Node[] tree;
+
+ public static void main(String[] args) throws Exception {
+ System.setIn(new FileInputStream("input.txt"));
+ BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); // 빠른 읽기
+ BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
+ StringBuilder sb = new StringBuilder();
+ StringTokenizer st = new StringTokenizer(br.readLine());
+
+ n = Integer.parseInt(st.nextToken());
+ m = Integer.parseInt(st.nextToken());
+
+ arr = new int[n+1];
+
+ for (int i=1; i<=n; i++) {
+ arr[i] = Integer.parseInt(br.readLine());
+ }
+
+ int[][] ranges = new int[m][2];
+ for (int i=0; i segRight || right < segLeft) return new Node(Integer.MAX_VALUE, 0);
+ // 양쪽이 전부 범위 안에 들때
+ if (left >= segLeft && right <= segRight) return tree[node];
+
+ // 나눠서 재귀적으로 찾기
+ int mid = (left + right) / 2;
+ Node l = findSeg(left, mid, node*2, segLeft, segRight);
+ Node r = findSeg(mid+1, right, node*2+1, segLeft, segRight);
+ return new Node(Math.min(l.mini, r.mini), Math.max(l.maxi, r.maxi));
+ }
+
+}
\ No newline at end of file
diff --git a/d1109/BJ1135.java b/d1109/BJ1135.java
new file mode 100644
index 0000000..bb8526f
--- /dev/null
+++ b/d1109/BJ1135.java
@@ -0,0 +1,56 @@
+package d1109;
+
+import java.io.*;
+import java.util.*;
+
+public class BJ1135 {
+
+ static List> graph;
+
+ public static void main(String[] args) throws Exception {
+ System.setIn(new FileInputStream("input.txt"));
+ BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); // 빠른 읽기
+ StringTokenizer st = new StringTokenizer(br.readLine());
+
+ int n = Integer.parseInt(st.nextToken());
+
+ st = new StringTokenizer(br.readLine());
+ graph = new ArrayList<>();
+ graph.add(new ArrayList<>()); // 민식이
+ st.nextToken();
+ for (int i=1; i());
+ int parent = Integer.parseInt(st.nextToken());
+ graph.get(parent).add(i);
+ }
+
+ int ans = dfs(0);
+ System.out.println(ans);
+ }
+
+ static int dfs(int emp) {
+ int time = 0;
+ int call = 0;
+
+ List children = graph.get(emp);
+ if (children.isEmpty()) {
+ return 0;
+ }
+
+ PriorityQueue pq = new PriorityQueue<>((t1, t2) -> t2 - t1);
+
+ for (int child : children) {
+ int dur = dfs(child);
+ pq.offer(dur);
+ }
+
+ while (!pq.isEmpty()) {
+ int cur = pq.poll();
+ call++;
+ time = Math.max(time, cur + call);
+ }
+
+ return time;
+ }
+
+}
\ No newline at end of file
diff --git a/d1109/bj2573.java b/d1109/bj2573.java
new file mode 100644
index 0000000..a1e7fb4
--- /dev/null
+++ b/d1109/bj2573.java
@@ -0,0 +1,114 @@
+package d1109;
+
+import java.io.*;
+import java.util.*;
+
+public class bj2573 {
+
+ static class Node {
+ Node(){}
+ Node(int ice, int r, int c) {
+ this.ice = ice;
+ this.r = r;
+ this.c = c;
+ }
+ int ice, r, c;
+ Node next;
+ }
+
+ static int[][] map;
+ static int n, m;
+ public static void main(String[] args) throws Exception {
+ System.setIn(new FileInputStream("input.txt"));
+ BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); // 빠른 읽기
+ BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
+ StringBuilder sb = new StringBuilder();
+ StringTokenizer st = new StringTokenizer(br.readLine());
+
+ n = Integer.parseInt(st.nextToken());
+ m = Integer.parseInt(st.nextToken());
+ map = new int[n][m];
+
+ Node head = new Node();
+ Node iter = head;
+
+ int blocks = 0;
+ for (int i=0; i= n || nc >= m) continue;
+ if (map[nr][nc] == 0 && !melted[nr][nc]) melt++;
+ }
+ cur.ice = Math.max(0, cur.ice-melt);
+ map[cur.r][cur.c] = cur.ice;
+ // ll 연결 끊기
+ if (cur.ice == 0) {
+ prev.next = cur.next;
+ cur.next = null;
+ melted[cur.r][cur.c] = true;
+ blocks--;
+ } else {
+ prev = prev.next;
+ }
+ }
+ if (blocks == 0) {
+ System.out.println(0);
+ return;
+ }
+ // check if one island -> bfs from head and see if matching block
+ int[] start = new int[] {head.next.r, head.next.c};
+ Queue q = new ArrayDeque<>();
+ q.offer(start);
+ boolean[][] visited = new boolean[n][m];
+ visited[start[0]][start[1]] = true;
+ int cnt = 0;
+ while (!q.isEmpty()) {
+ int[] cur = q.poll();
+ cnt++;
+ for (int i=0; i<4; i++) {
+ int nr = cur[0] + dr[i];
+ int nc = cur[1] + dc[i];
+ if (nr < 0 || nc < 0 || nr >= n || nc >= m) continue;
+ if (!visited[nr][nc] && map[nr][nc] > 0) {
+ q.offer(new int[] {nr, nc});
+ visited[nr][nc] = true;
+ }
+ }
+ }
+
+ if (cnt != blocks) break;
+
+ }
+ System.out.println(years);
+ }
+
+}
\ No newline at end of file
diff --git a/d1109/bj9663.java b/d1109/bj9663.java
new file mode 100644
index 0000000..59b1adb
--- /dev/null
+++ b/d1109/bj9663.java
@@ -0,0 +1,66 @@
+package d1109;
+
+import java.io.*;
+
+public class bj9663 {
+
+ static int n;
+ static boolean[][] chessboard;
+ static boolean[] selectedCol;
+ static int ans = 0;
+
+ public static void main(String[] args) throws Exception {
+// System.setIn(new FileInputStream("input.txt"));
+ BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); // 빠른 읽기
+
+ n = Integer.parseInt(br.readLine());
+ chessboard = new boolean[n][n];
+ selectedCol = new boolean[n];
+
+ dfs(0);
+
+ System.out.println(ans);
+
+ }
+
+ static void dfs(int cnt) {
+// System.out.println("debug");
+ if (cnt == n) {
+ ans++;
+ return;
+ }
+
+ for (int i = 0; i < n; i++) {
+ if (selectedCol[i]) // 세로 확인
+ continue;
+ if (diagonal(cnt, i)) // 대각선 확인
+ continue;
+ selectedCol[i] = true;
+ chessboard[cnt][i] = true;
+ dfs(cnt + 1);
+ selectedCol[i] = false;
+ chessboard[cnt][i] = false;
+ }
+ }
+
+ static boolean diagonal(int r, int c) {
+ int nr = r - 1;
+ int nc = c - 1;
+ while (nr >= 0 && nc >= 0) {
+ if (chessboard[nr][nc])
+ return true;
+ nr--;
+ nc--;
+ }
+ nr = r - 1;
+ nc = c + 1;
+ while (nr >= 0 && nc < n) {
+ if (chessboard[nr][nc]) return true;
+ nr--;
+ nc++;
+ }
+
+ return false;
+ }
+
+}