From 45e7f4492cee5413b5d5ed4286754979e0c94eeb Mon Sep 17 00:00:00 2001 From: YangJaeWon Date: Thu, 2 Nov 2023 01:55:31 +0900 Subject: [PATCH 1/2] =?UTF-8?q?feat:=201.=20=EC=8B=9C=EA=B0=84=EA=B4=80?= =?UTF-8?q?=EB=A6=AC=20=20(BOJ=5F1263)=20=20=20=20=20=20=202.=20=EC=B9=B4?= =?UTF-8?q?=EB=93=9C=20=EB=AC=B8=EC=9E=90=EC=97=B4(BOJ=5F13417)=20=20=20?= =?UTF-8?q?=20=20=20=203.=20=EB=B0=A9=ED=83=88=EC=B6=9C(BOJ=5F15729)=20=20?= =?UTF-8?q?=20=20=20=20=204.=20=EC=95=84=EA=B8=B0=EC=83=81=EC=96=B42(BOJ?= =?UTF-8?q?=5F17086)=20=20=20=20=20=20=205.=20=EC=96=91=EC=B9=98=EA=B8=B0?= =?UTF-8?q?=20=EA=BF=8D(BOJ=5F3187)=20=20=20=20=20=20=206.=20=EB=8B=A4?= =?UTF-8?q?=EC=9D=8C=20=EC=88=98=20=EA=B5=AC=ED=95=98=EA=B8=B0(BOJ=5F2697)?= =?UTF-8?q?=20=20=20=20=20=20=207.=20=ED=98=B8=EC=84=9D=EC=9D=B4=20?= =?UTF-8?q?=EB=91=90=EB=A7=88=EB=A6=AC=20=EC=B9=98=ED=82=A8(BOJ=5F21278)?= =?UTF-8?q?=20=20=20=20=20=20=208.=20=ED=8C=8C=EC=9D=BC=20=EC=A0=95?= =?UTF-8?q?=EB=A6=AC(BOJ=5F20291)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- baeck/BOJ_20291.java | 32 ++++++++++++ baeck/DFSAndBFS/BOJ_17086.java | 79 ++++++++++++++++++++++++++++ baeck/DFSAndBFS/BOJ_21278.java | 82 +++++++++++++++++++++++++++++ baeck/DFSAndBFS/BOJ_3187.java | 94 ++++++++++++++++++++++++++++++++++ baeck/greedy/BOJ_1263.java | 49 ++++++++++++++++++ baeck/greedy/BOJ_13417.java | 38 ++++++++++++++ baeck/greedy/BOJ_15729.java | 31 +++++++++++ baeck/greedy/BOJ_2697.java | 60 ++++++++++++++++++++++ 8 files changed, 465 insertions(+) create mode 100644 baeck/BOJ_20291.java create mode 100644 baeck/DFSAndBFS/BOJ_17086.java create mode 100644 baeck/DFSAndBFS/BOJ_21278.java create mode 100644 baeck/DFSAndBFS/BOJ_3187.java create mode 100644 baeck/greedy/BOJ_1263.java create mode 100644 baeck/greedy/BOJ_13417.java create mode 100644 baeck/greedy/BOJ_15729.java create mode 100644 baeck/greedy/BOJ_2697.java diff --git a/baeck/BOJ_20291.java b/baeck/BOJ_20291.java new file mode 100644 index 0000000..cfbd3bb --- /dev/null +++ b/baeck/BOJ_20291.java @@ -0,0 +1,32 @@ +package baeck; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.*; + +//파일 정리 +public class BOJ_20291 { + public static void main(String[] args) throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + int N = Integer.parseInt(br.readLine()); + HashMap input = new HashMap<>(); + for (int i = 0; i < N; i++) { + String temp = br.readLine(); + String[] tmp = temp.split("\\."); + String extension = tmp[tmp.length - 1]; + + if(input.containsKey(extension)) { + input.put(extension, input.get(extension) + 1); + } else { + input.put(extension, 1); + } + } + List keyList = new ArrayList<>(input.keySet()); + Collections.sort(keyList); + for (String key: keyList){ + System.out.println(key + " " + input.get(key)); + } + + } +} diff --git a/baeck/DFSAndBFS/BOJ_17086.java b/baeck/DFSAndBFS/BOJ_17086.java new file mode 100644 index 0000000..37f95c6 --- /dev/null +++ b/baeck/DFSAndBFS/BOJ_17086.java @@ -0,0 +1,79 @@ +package baeck.DFSAndBFS; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.LinkedList; +import java.util.Queue; +import java.util.StringTokenizer; + +//아기상어2 +public class BOJ_17086 { + private static int[][] map; + private static int[] dx = {-1, -1, -1, 0, 1, 1, 1, 0}; + private static int[] dy = {-1, 0, 1, 1, 1, 0, -1, -1}; + private static int N, M; + + public static void main(String[] args) throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + StringTokenizer st = new StringTokenizer(br.readLine()); + N = Integer.parseInt(st.nextToken()); + M = Integer.parseInt(st.nextToken()); + map = new int[N][M]; + + for (int i = 0; i < N; i++) { + st = new StringTokenizer(br.readLine()); + for (int j = 0; j < M; j++) { + map[i][j] = Integer.parseInt(st.nextToken()); + } + } + + int answer = 0; + for (int i = 0; i < N; i++) { + for (int j = 0; j < M; j++) { + answer = Math.max(answer, bfs(i, j)); + } + } + + System.out.println(answer); + } + + private static int bfs(int startX, int startY) { + Queue queue = new LinkedList<>(); + boolean[][] visited = new boolean[N][M]; + visited[startX][startY] = true; + queue.offer(new int[]{startX, startY, 0}); + + while (!queue.isEmpty()) { + int[] current = queue.poll(); + int x = current[0]; + int y = current[1]; + int distance = current[2]; + + // 상어를 만난 경우, 현재까지의 거리 반환 + if (map[x][y] == 1) { + return distance; + } + + // 상하좌우와 대각선 방향으로 이동 + for (int i = 0; i < 8; i++) { + int nx = x + dx[i]; + int ny = y + dy[i]; + + // 유효한 위치이고 아직 방문하지 않은 경우 + if (isValid(nx, ny) && !visited[nx][ny]) { + visited[nx][ny] = true; + queue.offer(new int[]{nx, ny, distance + 1}); + } + } + } + + return 0; + } + + // 주어진 위치가 유효한지 확인하는 함수 + private static boolean isValid(int x, int y) { + return x >= 0 && x < N && y >= 0 && y < M; + } +} + diff --git a/baeck/DFSAndBFS/BOJ_21278.java b/baeck/DFSAndBFS/BOJ_21278.java new file mode 100644 index 0000000..9f414f9 --- /dev/null +++ b/baeck/DFSAndBFS/BOJ_21278.java @@ -0,0 +1,82 @@ +package baeck.DFSAndBFS; + +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.util.*; + +//호석이 두마리 치킨 +public class BOJ_21278 { + static int N, M; // 건물의 개수(N)와 도로의 개수(M) + static List[] graph; // 건물 간의 연결 정보를 저장할 그래프 + static int[] chicken = new int[2]; // 치킨집 위치를 저장할 배열 + static int sum, min = Integer.MAX_VALUE; // 치킨집 거리의 합(sum)과 최소 거리(min) + + 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()); + + graph = new List[N + 1]; + for (int i = 1; i <= N; i++) { + graph[i] = new ArrayList<>(); + } + + // 도로 정보 입력 받기 + for (int i = 0; i < M; i++) { + st = new StringTokenizer(br.readLine()); + int a = Integer.parseInt(st.nextToken()); + int b = Integer.parseInt(st.nextToken()); + graph[a].add(b); + graph[b].add(a); + } + + // 모든 치킨집 조합에 대해 거리 합 계산하기 + for (int i = 1; i < N; i++) { + for (int j = i + 1; j <= N; j++) { + sum = 0; + for (int k = 1; k <= N; k++) { + if (k == i || k == j) continue; + int dist = bfs(k, i) + bfs(k, j); + sum += dist; + } + // 최소 거리 업데이트 + if (sum < min) { + min = sum; + chicken[0] = i; + chicken[1] = j; + } + } + } + + // 결과 출력 + System.out.println(chicken[0] + " " + chicken[1] + " " + min); + } + + // BFS를 사용하여 시작점부터 도착점까지의 최단 거리를 계산하는 메소드 + static int bfs(int start, int end) { + Queue queue = new LinkedList<>(); + boolean[] visited = new boolean[N + 1]; + int[] distance = new int[N + 1]; + + queue.offer(start); + visited[start] = true; + + while (!queue.isEmpty()) { + int cur = queue.poll(); + if (cur == end) { + return distance[cur]; + } + for (int next : graph[cur]) { + if (!visited[next]) { + visited[next] = true; + distance[next] = distance[cur] + 1; + queue.offer(next); + } + } + } + + return -1; // 도달할 수 없는 경우 + } +} diff --git a/baeck/DFSAndBFS/BOJ_3187.java b/baeck/DFSAndBFS/BOJ_3187.java new file mode 100644 index 0000000..3cbb4fb --- /dev/null +++ b/baeck/DFSAndBFS/BOJ_3187.java @@ -0,0 +1,94 @@ +package baeck.DFSAndBFS; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.Stack; +import java.util.StringTokenizer; + +//양치기 꿍 +public class BOJ_3187 { + static int R, C; // R은 행의 수, C는 열의 수 + static char[][] map; // 농장의 상태를 저장하는 2차원 배열 + static boolean[][] visited; // 방문 여부를 저장하는 2차원 배열 + static int[] dr = {-1, 0, 1, 0}; // 상, 우, 하, 좌 순서로 이동하기 위한 방향 벡터 + static int[] dc = {0, 1, 0, -1}; // 상, 우, 하, 좌 순서로 이동하기 위한 방향 벡터 + static int sheepTotal, wolfTotal; // 전체 양과 늑대의 수를 저장하는 변수 + + static class Pair { + int r, c; // 좌표를 저장하기 위한 Pair 클래스 + Pair(int r, int c) { + this.r = r; + this.c = c; + } + } + + public static void main(String[] args) throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + StringTokenizer st = new StringTokenizer(br.readLine()); + + R = Integer.parseInt(st.nextToken()); + C = Integer.parseInt(st.nextToken()); + + map = new char[R][C]; + visited = new boolean[R][C]; + + for (int i = 0; i < R; i++) { + map[i] = br.readLine().toCharArray(); + } + + // 방문하지 않은 모든 좌표에 대해 DFS 수행 + for (int i = 0; i < R; i++) { + for (int j = 0; j < C; j++) { + if (map[i][j] != '#' && !visited[i][j]) { + Pair start = new Pair(i, j); + int[] result = dfs(start); + // 양의 수가 늑대의 수보다 많다면 양이 살아남고, 그렇지 않다면 늑대가 살아남음 + if (result[0] > result[1]) { + sheepTotal += result[0]; + } else { + wolfTotal += result[1]; + } + } + } + } + + System.out.println(sheepTotal + " " + wolfTotal); // 결과 출력 + } + + static int[] dfs(Pair start) { + Stack stack = new Stack<>(); // DFS를 위한 스택 + stack.push(start); + visited[start.r][start.c] = true; + + int sheep = 0, wolf = 0; + + // 시작점이 양이나 늑대라면 카운트 증가 + if (map[start.r][start.c] == 'k') sheep++; + else if (map[start.r][start.c] == 'v') wolf++; + + while (!stack.isEmpty()) { + Pair cur = stack.pop(); + + // 4방향으로 이동 + for (int i = 0; i < 4; i++) { + int nr = cur.r + dr[i]; + int nc = cur.c + dc[i]; + + // 범위 내에 있고 방문하지 않은 점이며 울타리가 아닌지 확인 + if (nr >= 0 && nc >= 0 && nr < R && nc < C) { + if (map[nr][nc] != '#' && !visited[nr][nc]) { + visited[nr][nc] = true; + stack.push(new Pair(nr, nc)); + + // 양이나 늑대라면 카운트 증가 + if (map[nr][nc] == 'k') sheep++; + else if (map[nr][nc] == 'v') wolf++; + } + } + } + } + + return new int[] {sheep, wolf}; // 해당 영역에 있는 양과 늑대의 수 반환 + } +} diff --git a/baeck/greedy/BOJ_1263.java b/baeck/greedy/BOJ_1263.java new file mode 100644 index 0000000..8a0200e --- /dev/null +++ b/baeck/greedy/BOJ_1263.java @@ -0,0 +1,49 @@ +package baeck.greedy; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.PriorityQueue; +import java.util.StringTokenizer; + +// 시간관리 +public class BOJ_1263 { + static class Task implements Comparable { + int time, endTime; + public Task(int st, int et) { + this.time = st; + this.endTime = et; + } + @Override + public int compareTo(Task o) { + return o.endTime - this.endTime; + } + } + public static void main(String[] args) throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + int N = Integer.parseInt(br.readLine()); + PriorityQueue pq = new PriorityQueue<>(); + for (int i = 0; i < N; i++) { + StringTokenizer st = new StringTokenizer(br.readLine()); + int T = Integer.parseInt(st.nextToken()); + int S = Integer.parseInt(st.nextToken()); + pq.offer(new Task(T, S)); + } + int now = 1000001; + +// 만약 (현재시간 > 현재 일의 마감시간) 이라면: +// 현재시간 = 현재 마감시간 - 현재 걸리는시간 +// 아니라면: +// 현재시간 = 현재시간 - 현재 걸리는시간 + while(!pq.isEmpty()) { + Task task=pq.poll(); + if(now > task.time) { + now = Math.min(now - task.time, task.endTime - task.time); + } else { + now = now - task.time; + } + } + if(now < 1) now = -1; + System.out.println(now); + } +} diff --git a/baeck/greedy/BOJ_13417.java b/baeck/greedy/BOJ_13417.java new file mode 100644 index 0000000..d7a36e0 --- /dev/null +++ b/baeck/greedy/BOJ_13417.java @@ -0,0 +1,38 @@ +package baeck.greedy; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.ArrayDeque; +import java.util.Deque; +import java.util.StringTokenizer; + +//카드 문자열 +public class BOJ_13417 { + public static void main(String[] args) throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + int T = Integer.parseInt(br.readLine()); + + for (int i = 0; i < T; i++) { + int N = Integer.parseInt(br.readLine()); + String[] input = br.readLine().split(" "); + + Deque deque = new ArrayDeque<>(); + deque.add(input[0].charAt(0)); + for (int j = 1; j < N; j++) { + if(deque.peekFirst() >= input[j].charAt(0)) { + deque.addFirst(input[j].charAt(0)); + } else { + deque.addLast(input[j].charAt(0)); + } + } + StringBuilder sb = new StringBuilder(); + while (!deque.isEmpty()) { + sb.append(deque.pollFirst()); + } + System.out.println(sb.toString()); + + } + + } +} diff --git a/baeck/greedy/BOJ_15729.java b/baeck/greedy/BOJ_15729.java new file mode 100644 index 0000000..e6e6c88 --- /dev/null +++ b/baeck/greedy/BOJ_15729.java @@ -0,0 +1,31 @@ +package baeck.greedy; + + +import java.io.IOException; +import java.util.Scanner; + +//방탈출 +public class BOJ_15729 { + public static void main(String[] args) throws IOException { + Scanner sc = new Scanner(System.in); + int N = sc.nextInt(); + int[] arr = new int[N]; + int[] target = new int[N]; + + for (int i = 0; i < N; i++) { + target[i] = sc.nextInt(); + } + int count = 0; + + for (int i = 0; i < N; i++) { + if(arr[i] != target[i]) { + count++; + for (int j = i; j < N && j <= i + 2; j++) { + arr[j] ^= 1; + } + } + } + System.out.println(count); + + } +} diff --git a/baeck/greedy/BOJ_2697.java b/baeck/greedy/BOJ_2697.java new file mode 100644 index 0000000..833694a --- /dev/null +++ b/baeck/greedy/BOJ_2697.java @@ -0,0 +1,60 @@ +package baeck.greedy; + +import java.util.Scanner; +//다음 수 구하기 +public class BOJ_2697 { + // 주어진 배열 a에서 다음 순열을 찾는 함수 + static boolean next_permutation(int[] a) { + // 1. a[i-1] < a[i]를 만족하는 가장 큰 i를 찾는다. + int i = a.length-1; + while (i > 0 && a[i-1] >= a[i]) { + i -= 1; + } + // 이미 주어진 배열 a가 내림차순이면, 즉 마지막 순열이면 false를 반환한다. + if (i <= 0) { + return false; + } + + // 2. j >= i이면서 a[j] > a[i-1]를 만족하는 가장 큰 j를 찾는다. + int j = a.length-1; + while (a[j] <= a[i-1]) { + j -= 1; + } + + // 3. a[i-1]과 a[j]를 swap한다. + int temp = a[i-1]; + a[i-1] = a[j]; + a[j] = temp; + + // 4. a[i]부터 끝까지를 뒤집는다. + j = a.length-1; + while (i < j) { + temp = a[i]; + a[i] = a[j]; + a[j] = temp; + i += 1; + j -= 1; + } + return true; + } + + public static void main(String args[]) { + Scanner sc = new Scanner(System.in); + int t = sc.nextInt(); + while (t-- > 0) { + String s = sc.next(); + int[] a = new int[s.length()]; + for (int i=0; i Date: Thu, 9 Nov 2023 14:36:45 +0900 Subject: [PATCH 2/2] =?UTF-8?q?feat:=201=EB=A1=9C=20=EB=A7=8C=EB=93=A4?= =?UTF-8?q?=EA=B8=B0=202(=EC=8B=A41)=20BOJ=5F12852=20=20=20=20=20=20=20htt?= =?UTF-8?q?ps://www.acmicpc.net/problem/12852=20=20=20=20=20=20=20?= =?UTF-8?q?=EC=A0=95=EC=88=98=20=EC=82=BC=EA=B0=81=ED=98=95(=EC=8B=A4?= =?UTF-8?q?=EB=B2=841)=20BOJ=5F1932=20=20=20=20=20=20=20https://www.acmicp?= =?UTF-8?q?c.net/problem/1932=20=20=20=20=20=20=202=C3=97n=20=ED=83=80?= =?UTF-8?q?=EC=9D=BC=EB=A7=81=202(=EC=8B=A43)=20BOJ=5F11727=20=20=20=20=20?= =?UTF-8?q?=20=20https://www.acmicpc.net/problem/11727=20=20=20=20=20=20?= =?UTF-8?q?=20=ED=87=B4=EC=82=AC(=EC=8B=A43)=20BOJ=5F14501=20=20=20=20=20?= =?UTF-8?q?=20=20https://www.acmicpc.net/problem/14501?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ✔ 시뮬레이션 스타트와 링크(실1) BOJ_14889 https://www.acmicpc.net/problem/14889 연산자 끼워넣기(실1) BOJ_14888 https://www.acmicpc.net/problem/14888 --- baeck/BOJ_14888.java | 53 +++++++++++++++++++++++++++++ baeck/BOJ_14889.java | 75 +++++++++++++++++++++++++++++++++++++++++ baeck/BOJ_1932.java | 50 +++++++++++++++++++++++++++ baeck/dp/BOJ_11727.java | 20 +++++++++++ baeck/dp/BOJ_12852.java | 46 +++++++++++++++++++++++++ baeck/dp/BOJ_14501.java | 26 ++++++++++++++ 6 files changed, 270 insertions(+) create mode 100644 baeck/BOJ_14888.java create mode 100644 baeck/BOJ_14889.java create mode 100644 baeck/BOJ_1932.java create mode 100644 baeck/dp/BOJ_11727.java create mode 100644 baeck/dp/BOJ_12852.java create mode 100644 baeck/dp/BOJ_14501.java diff --git a/baeck/BOJ_14888.java b/baeck/BOJ_14888.java new file mode 100644 index 0000000..4696205 --- /dev/null +++ b/baeck/BOJ_14888.java @@ -0,0 +1,53 @@ +package baeck; + +import java.util.Scanner; +//연산자 끼워넣기 +public class BOJ_14888 { + static int N; + static int[] number; + static int[] operator = new int[4]; + static int max = Integer.MIN_VALUE; + static int min = Integer.MAX_VALUE; + + public static void main(String[] args) { + Scanner sc = new Scanner(System.in); + N = sc.nextInt(); + number = new int[N]; + + for(int i = 0; i < N; i++) { + number[i] = sc.nextInt(); + } + + for(int i = 0; i < 4; i++) { + operator[i] = sc.nextInt(); + } + + dfs(number[0], 1); + + System.out.println(max); + System.out.println(min); + } + + static void dfs(int num, int idx) { + if(idx == N) { + max = Math.max(max, num); + min = Math.min(min, num); + return; + } + + for(int i = 0; i < 4; i++) { + if(operator[i] > 0) { + operator[i]--; + + switch(i) { + case 0: dfs(num + number[idx], idx + 1); break; + case 1: dfs(num - number[idx], idx + 1); break; + case 2: dfs(num * number[idx], idx + 1); break; + case 3: dfs(num / number[idx], idx + 1); break; + } + + operator[i]++; + } + } + } +} diff --git a/baeck/BOJ_14889.java b/baeck/BOJ_14889.java new file mode 100644 index 0000000..5026c01 --- /dev/null +++ b/baeck/BOJ_14889.java @@ -0,0 +1,75 @@ +package baeck; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.StringTokenizer; + +//스타트와 링크 +public class BOJ_14889 { + static int N; + static int[][] arr; + static boolean[] visit; + static int Min = Integer.MAX_VALUE; + + public static void main(String[] args) throws Exception { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + StringTokenizer st; + + N = Integer.parseInt(br.readLine()); + arr = new int[N][N]; + visit = new boolean[N]; + + for(int i = 0; i < N; i++) { + st = new StringTokenizer(br.readLine(), " "); + for(int j = 0; j < N; j++) { + arr[i][j] = Integer.parseInt(st.nextToken()); + } + } + + dfs(0, 0); + System.out.println(Min); + } + + static void dfs(int idx, int count) { + if(count == N / 2) { + diff(); + return; + } + + for(int i = idx; i < N; i++) { + if(!visit[i]) { + visit[i] = true; + dfs(i + 1, count + 1); + visit[i] = false; + } + } + } + + static void diff() { + int team_start = 0; + int team_link = 0; + + for(int i = 0; i < N - 1; i++) { + for(int j = i + 1; j < N; j++) { + if(visit[i] == true && visit[j] == true) { + team_start += arr[i][j]; + team_start += arr[j][i]; + } + else if(visit[i] == false && visit[j] == false) { + team_link += arr[i][j]; + team_link += arr[j][i]; + } + } + } + + int val = Math.abs(team_start - team_link); + + if(val == 0) { + System.out.println(val); + System.exit(0); + } + + Min = Math.min(val, Min); + } +} diff --git a/baeck/BOJ_1932.java b/baeck/BOJ_1932.java new file mode 100644 index 0000000..9f40147 --- /dev/null +++ b/baeck/BOJ_1932.java @@ -0,0 +1,50 @@ +package baeck; + +import java.util.Scanner; + +//정수 삼각형 +public class BOJ_1932 { + public static void main(String[] args) { + Scanner scanner = new Scanner(System.in); + int n = scanner.nextInt(); + int[][] triangle = new int[n][n]; + int[][] dp = new int[n][n]; + + // 삼각형의 각 숫자를 입력 받습니다. + for (int i = 0; i < n; i++) { + for (int j = 0; j <= i; j++) { + triangle[i][j] = scanner.nextInt(); + } + } + + // dp의 첫 번째 값은 삼각형의 첫 번째 값으로 초기화합니다. + dp[0][0] = triangle[0][0]; + + for (int i = 1; i < n; i++) { + for (int j = 0; j <= i; j++) { + // 가장 왼쪽에 위치한 경우 + if (j == 0) { + dp[i][j] = dp[i - 1][j] + triangle[i][j]; + } + // 가장 오른쪽에 위치한 경우 + else if (j == i) { + dp[i][j] = dp[i - 1][j - 1] + triangle[i][j]; + } + // 그 외의 경우 + else { + dp[i][j] = Math.max(dp[i - 1][j - 1], dp[i - 1][j]) + triangle[i][j]; + } + } + } + + // dp의 마지막 행에서 가장 큰 값 찾기 + int max = dp[n - 1][0]; + for (int i = 1; i < n; i++) { + max = Math.max(max, dp[n - 1][i]); + } + + System.out.println(max); + + scanner.close(); + } +} diff --git a/baeck/dp/BOJ_11727.java b/baeck/dp/BOJ_11727.java new file mode 100644 index 0000000..198c0c0 --- /dev/null +++ b/baeck/dp/BOJ_11727.java @@ -0,0 +1,20 @@ +package baeck.dp; + +import java.util.Scanner; + +//2 x n 타일 2 +public class BOJ_11727 { + public static void main(String[] args) { + Scanner sc = new Scanner(System.in); + int n = sc.nextInt(); + int[] dp = new int[n + 1]; + + dp[0] = dp[1] = 1; + + for (int i = 2; i <= n; i++) { + dp[i] = (dp[i - 1] + 2 * dp[i - 2]) % 10007; + } + + System.out.println(dp[n]); + } +} diff --git a/baeck/dp/BOJ_12852.java b/baeck/dp/BOJ_12852.java new file mode 100644 index 0000000..1ad8d76 --- /dev/null +++ b/baeck/dp/BOJ_12852.java @@ -0,0 +1,46 @@ +package baeck.dp; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; + +// 1로 만들기 2 +public class BOJ_12852 { + public static void main(String[] args) throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + int N = Integer.parseInt(br.readLine()); + int[] dp = new int[N + 1]; // 최소 연산 횟수를 저장할 배열 + int[] prev = new int[N + 1]; // 이전 수를 저장할 배열 + + dp[1] = 0; // 1은 이미 1이므로 연산 횟수는 0입니다. + + for (int i = 2; i <= N; i++) { + dp[i] = dp[i - 1] + 1; // 연산 1: 현재 수에서 1을 뺀 경우 + prev[i] = i - 1; // 이전 수는 현재 수에서 1을 뺀 수입니다. + + if (i % 2 == 0 && dp[i] > dp[i / 2] + 1) { + // 연산 2: 현재 수가 2로 나누어 떨어지는 경우 + dp[i] = dp[i / 2] + 1; + prev[i] = i / 2; + } + + if (i % 3 == 0 && dp[i] > dp[i / 3] + 1) { + // 연산 3: 현재 수가 3으로 나누어 떨어지는 경우 + dp[i] = dp[i / 3] + 1; + prev[i] = i / 3; + } + } + + System.out.println(dp[N]); // N을 1로 만드는 최소 연산 횟수 출력 + + // 경로 역추적 + StringBuilder sb = new StringBuilder(); + int num = N; + while (num != 1) { + sb.append(num).append(" "); + num = prev[num]; + } + sb.append(1); + System.out.println(sb.reverse()); // 경로 출력 + } +} diff --git a/baeck/dp/BOJ_14501.java b/baeck/dp/BOJ_14501.java new file mode 100644 index 0000000..77f0b3d --- /dev/null +++ b/baeck/dp/BOJ_14501.java @@ -0,0 +1,26 @@ +package baeck.dp; + +import java.util.Scanner; + +//퇴사 +public class BOJ_14501 { + public static void main(String[] args) { + Scanner sc = new Scanner(System.in); + int N = sc.nextInt(); + int[] T = new int[N+5]; + int[] P = new int[N+5]; + int[] dp = new int[N+5]; + for(int i = 1; i <= N; i++) { + T[i] = sc.nextInt(); + P[i] = sc.nextInt(); + } + for(int i = N; i > 0; i--) { + int day = i + T[i]; // 상담이 끝나는 날 + if(day <= N+1) // 상담이 끝나는 날이 퇴사일을 넘지 않으면 + dp[i] = Math.max(P[i] + dp[day], dp[i+1]); // 오늘 상담을 하는 경우 vs 오늘 상담을 하지 않는 경우 + else + dp[i] = dp[i+1]; // 상담이 끝나는 날이 퇴사일을 넘으면 오늘 상담을 하지 않는다. + } + System.out.println(dp[1]); + } +}