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; + } + +}