From 7302c3f894c329384f0eadf15469744f066915c8 Mon Sep 17 00:00:00 2001 From: kwonghyun Date: Thu, 16 Nov 2023 12:00:08 +0900 Subject: [PATCH 1/3] 11/16 --- src/dp/Boj11727.java | 21 +++++++++ src/dp/Boj12852.java | 54 +++++++++++++++++++++ src/dp/Boj14501.java | 34 ++++++++++++++ src/dp/Boj1932.java | 34 ++++++++++++++ src/implement/Boj14888.java | 73 +++++++++++++++++++++++++++++ src/implement/Boj14889.java | 59 +++++++++++++++++++++++ src/implement/Boj14891.java | 93 +++++++++++++++++++++++++++++++++++++ src/implement/Boj15686.java | 70 ++++++++++++++++++++++++++++ 8 files changed, 438 insertions(+) create mode 100644 src/dp/Boj11727.java create mode 100644 src/dp/Boj12852.java create mode 100644 src/dp/Boj14501.java create mode 100644 src/dp/Boj1932.java create mode 100644 src/implement/Boj14888.java create mode 100644 src/implement/Boj14889.java create mode 100644 src/implement/Boj14891.java create mode 100644 src/implement/Boj15686.java diff --git a/src/dp/Boj11727.java b/src/dp/Boj11727.java new file mode 100644 index 0000000..8f85c53 --- /dev/null +++ b/src/dp/Boj11727.java @@ -0,0 +1,21 @@ +package dp; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; + +public class Boj11727 { + public static void main(String[] args) throws IOException { + BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); + int n = Integer.parseInt(reader.readLine()); + int[] dp = new int[n+1]; + + dp[0] = 1; + dp[1] = 1; + for(int i=2; i 0) { + sb.append(n+" "); + n =path[n]; + + } + + System.out.println(sb.toString()); + + } +} diff --git a/src/dp/Boj14501.java b/src/dp/Boj14501.java new file mode 100644 index 0000000..b4b5436 --- /dev/null +++ b/src/dp/Boj14501.java @@ -0,0 +1,34 @@ +package dp; + +import java.io.BufferedReader; +import java.io.FileInputStream; +import java.io.InputStreamReader; + +public class Boj14501 { + public static void main(String[] args) throws Exception { + BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("input.txt"))); + + int N = Integer.parseInt(br.readLine()); + + int[] T = new int[N+10]; + int[] P = new int[N+10]; + int[] dp = new int[N+10]; + int max = 0; + String[] str; + for (int i = 1; i <=N; i++) { + str = br.readLine().split(" "); + T[i] = Integer.parseInt(str[0]); + P[i] = Integer.parseInt(str[1]); + } + //------------입력부------------// + + + for (int i = 1; i <=N+1; i++) { + dp[i] = Math.max(dp[i], max); + dp[T[i]+i] = Math.max(dp[T[i]+i],P[i]+dp[i]); + max = Math.max(max, dp[i]); + + } + System.out.println(max); + } +} diff --git a/src/dp/Boj1932.java b/src/dp/Boj1932.java new file mode 100644 index 0000000..dc210ef --- /dev/null +++ b/src/dp/Boj1932.java @@ -0,0 +1,34 @@ +package dp; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.StringTokenizer; + +public class Boj1932 { + public static void main(String[] args) throws IOException { + BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); + int n = Integer.parseInt(reader.readLine()); + int[][] triangle = new int[n][n]; + int[][] dp = new int[n][n]; + + for(int i = 0; i < n; i++) { + StringTokenizer st = new StringTokenizer(reader.readLine()); + for(int j = 0; j < i+1; j++) { + triangle[i][j] = Integer.parseInt(st.nextToken()); + } + } + + for(int i = 0; i < n; i++) { + dp[n-1][i] = triangle[n-1][i]; + } + + for(int i = 2; i <= n; i++) { + for(int j = 0; j <= n-i; j++) { + dp[n-i][j] = Math.max(dp[n-i+1][j], dp[n-i+1][j+1]) + triangle[n-i][j]; + } + } + + System.out.println(dp[0][0]); + } +} diff --git a/src/implement/Boj14888.java b/src/implement/Boj14888.java new file mode 100644 index 0000000..78bf686 --- /dev/null +++ b/src/implement/Boj14888.java @@ -0,0 +1,73 @@ +package implement; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.Scanner; +import java.util.StringTokenizer; + +public class Boj14888 { + static int n; + static int[] arr; + static int[] operator = new int[4]; // 0 + , 1 -, 2 *, 3 / + static int max = Integer.MIN_VALUE; + static int min = Integer.MAX_VALUE; + + public static void main(String[] args) throws IOException { + // input + BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); + String s = reader.readLine(); + n = Integer.parseInt(s); + arr = new int[n]; + int[] result = new int[n]; + s = reader.readLine(); + StringTokenizer st = new StringTokenizer(s, " "); + + for (int i = 0; i < n; i++) { + arr[i] = Integer.parseInt(st.nextToken()); + } + + s = reader.readLine(); + st = new StringTokenizer(s, " "); + + for (int i = 0; i < 4; i++) { + operator[i] = Integer.parseInt(st.nextToken()); + } + //input end + + backTracking(1, arr[0]); + System.out.println(max); + System.out.println(min); + } + + + static void backTracking(int d, int value) { + if (d == n) { // depth가 n이 되면 최대값 판별 후 return + max = Math.max(max, value); + min = Math.min(min, value); + return; + } + for (int i = 0; i < 4; i++) { // operator 배열 탐색 + + if (operator[i] > 0) { // 해당 연산자가 1개 이상 있는 경우에 + operator[i]--; // 연산자를 사용할 것이기에 1을 빼준다. + + switch (i) { + case 0: // 연산자가 +면 + backTracking(d + 1, value + arr[d]); // depth를 1 증가시키고 value값 계산 후 dfs 호출 + break; + case 1: // 연산자가 -면 + backTracking(d + 1, value - arr[d]); // depth를 1 증가시키고 value값 계산 후 dfs 호출 + break; + case 2: // 연산자가 *면 + backTracking(d + 1, value * arr[d]); // depth를 1 증가시키고 value값 계산 후 dfs 호출 + break; + case 3: // 연산자가 /면 + backTracking(d + 1, value / arr[d]); // depth를 1 증가시키고 value값 계산 후 dfs 호출 + break; + } + operator[i]++; // 사용한 연산자를 다음 dfs에서 사용할 수 있도록 다시 되돌려준다. + } + } + } +} diff --git a/src/implement/Boj14889.java b/src/implement/Boj14889.java new file mode 100644 index 0000000..9b164d4 --- /dev/null +++ b/src/implement/Boj14889.java @@ -0,0 +1,59 @@ +package implement; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.StringTokenizer; + +public class Boj14889 { + static int[][] board; + static boolean[] visited; + static int N; + static int Min = Integer.MAX_VALUE; + public static void main(String[] args) throws IOException { + BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); + N = Integer.parseInt(reader.readLine()); + board = new int[N][N]; + visited = new boolean[N]; + for (int i = 0; i < N; i++) { + StringTokenizer st = new StringTokenizer(reader.readLine()); + for (int j = 0; j < N; j++) { + board[i][j] = Integer.parseInt(st.nextToken()); + } + } + dfs(0, 0); + System.out.println(Min); + } + public static void dfs(int idx, int depth) { + if(depth == N / 2) { + int startTeam = 0, linkTeam = 0; + for (int i = 0; i < N - 1; i++) { + for (int j = i + 1; j < N; j++) { // 중복 방지 + if (visited[i] && visited[j]) { + startTeam += board[i][j]; + startTeam += board[j][i]; + } + else if (!visited[i] && !visited[j]) { + linkTeam += board[i][j]; + linkTeam += board[j][i]; + } + } + } + // 두 팀의 점수 차이 (절댓값) + int val = Math.abs(startTeam - linkTeam); + if (val == 0) { + System.out.println(val); + System.exit(0); + } + Min = Math.min(val, Min); + return; + } + for (int i = idx; i < N; i++) { + if(!visited[i]) { + visited[i] = true; + dfs(i + 1, depth + 1); + visited[i] = false; + } + } + } +} diff --git a/src/implement/Boj14891.java b/src/implement/Boj14891.java new file mode 100644 index 0000000..b9105b6 --- /dev/null +++ b/src/implement/Boj14891.java @@ -0,0 +1,93 @@ +package implement; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.StringTokenizer; + +public class Boj14891 { + static int gear[][]; + static int d[]; //기어의 회전 정보를 담고있음 + static int n,m; + + public static void main(String[] args) throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + StringTokenizer st; + + gear = new int[4][8]; + + for(int i=0; i<4 ;i++) { + String s = br.readLine(); + for(int j=0; j<8; j++) { + gear[i][j] = s.charAt(j) - '0'; + } + } + + int k = Integer.parseInt(br.readLine()); + + while(k-->0) { + st = new StringTokenizer(br.readLine()); + //배열에 담긴 gear는 1부터 시작이아닌 0부터라 -1을 해줌 + int gearN = Integer.parseInt(st.nextToken()) - 1; + int turn = Integer.parseInt(st.nextToken()); + + //톱니의 회전방향 정보를 담음 + d = new int[4]; + + d[gearN] = turn; + checkDir(gearN); + gearTurn(); + } + + int ans =0; + if(gear[0][0] == 1) ans+=1; + if(gear[1][0] == 1) ans+=2; + if(gear[2][0] == 1) ans+=4; + if(gear[3][0] == 1) ans+=8; + System.out.println(ans); + } + + static void checkDir(int gearN){ + //좌측 톱니 회전 방향 검사 + for(int i=gearN-1; i>=0; i--) { + if(gear[i][2] != gear[i+1][6]) { + d[i] = -d[i+1]; + }else { + //회전을 하지않으면 다음 톱니도 회전을 하지 않게 된다. + break; + } + } + //우측 톱니 회전 방향 검사 + for(int i=gearN+1; i<4; i++) { + if(gear[i][6] != gear[i-1][2]) { + d[i] = -d[i-1]; + }else { + //회전을 하지않으면 다음 톱니도 회전을 하지 않게 된다. + break; + } + } + } + + static void gearTurn() { + int temp = 0; + + for(int i=0; i<4; i++) { //모든 톱니에 대해서 + //시계방향 회전 + if(d[i] == 1) { + temp = gear[i][7]; + for(int j=7; j>0; j--) { + gear[i][j] = gear[i][j-1]; + } + gear[i][0] = temp; + } + //반시계방향회전 + if(d[i] == -1) { + temp = gear[i][0]; + for(int j=0; j<7; j++) { + gear[i][j] = gear[i][j+1]; + } + gear[i][7] = temp; + } + } + } +} diff --git a/src/implement/Boj15686.java b/src/implement/Boj15686.java new file mode 100644 index 0000000..55ae2eb --- /dev/null +++ b/src/implement/Boj15686.java @@ -0,0 +1,70 @@ +package implement; + +import java.util.ArrayList; +import java.util.Scanner; + +public class Boj15686 { + static int n, m; + static int[][] board; + static int min = Integer.MAX_VALUE; + static ArrayList chickenList = new ArrayList<>(); //치킨집 위치를 저장하는 리스트 + static ArrayList houseList = new ArrayList<>(); // 집의 위치를 저장하는 리스트 + static boolean[] chickenVisited; // 뽑은 치킨집 체크 + + public static void main(String[] args) { + Scanner scan = new Scanner(System.in); + + n = scan.nextInt(); + m = scan.nextInt(); + + board = new int[n][n]; + for(int i = 0; i < n; i++) { + for(int j = 0; j < n; j++) { + board[i][j] = scan.nextInt(); + if(board[i][j] == 1) houseList.add(new Node(i, j)); + else if(board[i][j] == 2) chickenList.add(new Node(i, j)); + } + } + + chickenVisited = new boolean[chickenList.size()]; + backtracking(0, 0); //m개의 치킨집을 뽑는다. + System.out.println(min); + } + + public static void backtracking(int count, int idx) { + if(count == m) { //치킨 거리의 최솟값을 구한다. + int total = 0; // 도시의 치킨거리 + for(int i = 0; i < houseList.size(); i++) { + int sum = Integer.MAX_VALUE; + for(int j = 0; j < chickenList.size(); j++) { + if(chickenVisited[j] == true) { //i번째 집에서부터 j번짜 치킨집 까지의 거리 중 최소값을 구한다. + int dist = Math.abs(houseList.get(i).x - chickenList.get(j).x) + + Math.abs(houseList.get(i).y - chickenList.get(j).y); + sum = Math.min(sum, dist); + } + } + total += sum; + } + min = Math.min(total, min); + return; + } + + for(int i = idx; i < chickenList.size(); i++) { + if(chickenVisited[i] == false) { + chickenVisited[i] = true; + backtracking(count + 1, i + 1); + chickenVisited[i] = false; + } + } + } + + public static class Node { + int x; + int y; + + public Node(int x, int y) { + this.x = x; + this.y = y; + } + } +} From 9daf9019c1c8a23060eb800b47fbb247a158e07d Mon Sep 17 00:00:00 2001 From: kwonghyun Date: Fri, 29 Mar 2024 16:33:56 +0900 Subject: [PATCH 2/3] =?UTF-8?q?=EB=B0=B1=ED=8A=B8=EB=9E=98=ED=82=B9=20-=20?= =?UTF-8?q?N=EA=B3=BC=20M=206~12?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/backtracking/Boj15655.java | 57 +++++++++++++++++++++++++++++++ src/backtracking/Boj15656.java | 54 ++++++++++++++++++++++++++++++ src/backtracking/Boj15657.java | 54 ++++++++++++++++++++++++++++++ src/backtracking/Boj15663.java | 61 ++++++++++++++++++++++++++++++++++ src/backtracking/Boj15664.java | 57 +++++++++++++++++++++++++++++++ src/backtracking/Boj15665.java | 53 +++++++++++++++++++++++++++++ src/backtracking/Boj15666.java | 54 ++++++++++++++++++++++++++++++ 7 files changed, 390 insertions(+) create mode 100644 src/backtracking/Boj15655.java create mode 100644 src/backtracking/Boj15656.java create mode 100644 src/backtracking/Boj15657.java create mode 100644 src/backtracking/Boj15663.java create mode 100644 src/backtracking/Boj15664.java create mode 100644 src/backtracking/Boj15665.java create mode 100644 src/backtracking/Boj15666.java diff --git a/src/backtracking/Boj15655.java b/src/backtracking/Boj15655.java new file mode 100644 index 0000000..92ea8a9 --- /dev/null +++ b/src/backtracking/Boj15655.java @@ -0,0 +1,57 @@ +package backtracking; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.Arrays; +import java.util.StringTokenizer; + +// https://www.acmicpc.net/problem/15655 +// N과 M (6) +public class Boj15655 { + static int[] arr; + static int[] selected; + static boolean[] visited; + static StringBuilder sb; + static int N; + static int M; + + public static void main(String[] args) throws IOException { + BufferedReader bf = new BufferedReader(new InputStreamReader(System.in)); + StringTokenizer st = new StringTokenizer(bf.readLine()); + N = Integer.parseInt(st.nextToken()); + M = Integer.parseInt(st.nextToken()); + + + StringTokenizer ints = new StringTokenizer(bf.readLine()); + arr = new int[N]; + arr = Arrays.stream(arr) + .map(i -> Integer.parseInt(ints.nextToken())) + .sorted() + .toArray(); + + selected = new int[M]; + sb = new StringBuilder(); + visited = new boolean[N]; + dfs(0, 0); + System.out.println(sb.toString()); + + } + + static void dfs(int depth, int now) { + if (depth == M) { + Arrays.stream(selected).forEach(i -> sb.append(i + " ")); + sb.append("\n"); + return; + } + + for (int i = now; i < N; i++) { + if (!visited[i]) { + selected[depth] = arr[i]; + visited[i] = true; + dfs(depth + 1, i + 1); + visited[i] = false; + } + } + } +} diff --git a/src/backtracking/Boj15656.java b/src/backtracking/Boj15656.java new file mode 100644 index 0000000..93884ef --- /dev/null +++ b/src/backtracking/Boj15656.java @@ -0,0 +1,54 @@ +package backtracking; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.Arrays; +import java.util.StringTokenizer; + +// https://acmicpc.net/problem/15656 +// N과 M (7) +public class Boj15656 { + static int[] arr; + static int[] selected; + static StringBuilder sb; + static int N; + static int M; + + public static void main(String[] args) throws IOException { + BufferedReader bf = new BufferedReader(new InputStreamReader(System.in)); + { + StringTokenizer st = new StringTokenizer(bf.readLine()); + N = Integer.parseInt(st.nextToken()); + M = Integer.parseInt(st.nextToken()); + } + + arr = new int[N]; + { + StringTokenizer st = new StringTokenizer(bf.readLine()); + arr = Arrays.stream(arr) + .map(i -> Integer.parseInt(st.nextToken())) + .sorted() + .toArray(); + } + sb = new StringBuilder(); + selected = new int[M]; + dfs(0); + System.out.println(sb.toString()); + } + + static void dfs(int depth) { + if (depth == M) { + Arrays.stream(selected) + .forEach(i -> sb.append(i + " ")); + sb.append("\n"); + return; + } + + Arrays.stream(arr).forEach(i -> { + selected[depth] = i; + dfs(depth + 1); + } + ); + } +} diff --git a/src/backtracking/Boj15657.java b/src/backtracking/Boj15657.java new file mode 100644 index 0000000..d53aeb7 --- /dev/null +++ b/src/backtracking/Boj15657.java @@ -0,0 +1,54 @@ +package backtracking; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.Arrays; +import java.util.StringTokenizer; + +// https://acmicpc.net/problem/15657 +// N과 M (8) +public class Boj15657 { + static int N; + static int M; + static int[] arr; + static int[] selected; + static StringBuilder sb; + + public static void main(String[] args) throws IOException { + BufferedReader bf = new BufferedReader(new InputStreamReader(System.in)); + + { + StringTokenizer st = new StringTokenizer(bf.readLine()); + N = Integer.parseInt(st.nextToken()); + M = Integer.parseInt(st.nextToken()); + arr = new int[N]; + selected = new int[M]; + } + + { + StringTokenizer st = new StringTokenizer(bf.readLine()); + arr = Arrays.stream(arr) + .map(i -> Integer.parseInt(st.nextToken())) + .sorted() + .toArray(); + } + + sb = new StringBuilder(); + dfs(0, 0); + System.out.println(sb.toString()); + } + + static void dfs(int depth, int now) { + if (depth == M) { + Arrays.stream(selected).forEach(i -> sb.append(i + " ")); + sb.append("\n"); + return; + } + + for (int i = now; i < N; i++) { + selected[depth] = arr[i]; + dfs(depth + 1, i); + } + } +} diff --git a/src/backtracking/Boj15663.java b/src/backtracking/Boj15663.java new file mode 100644 index 0000000..9f3bee0 --- /dev/null +++ b/src/backtracking/Boj15663.java @@ -0,0 +1,61 @@ +package backtracking; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.*; +import java.util.stream.Collectors; + +// https://www.acmicpc.net/problem/15663 +// N과 M (9) +// TODO 다시 해볼 것 +public class Boj15663 { + static int N; + static int M; + static int[] arr; + static int[] selected; + static HashSet ans = new LinkedHashSet<>(); + static boolean[] visited; + + public static void main(String[] args) throws IOException { + BufferedReader bf = new BufferedReader(new InputStreamReader(System.in)); + { + StringTokenizer st = new StringTokenizer(bf.readLine()); + N = Integer.parseInt(st.nextToken()); + M = Integer.parseInt(st.nextToken()); + arr = new int[N]; + visited = new boolean[N]; + selected = new int[M]; + } + { + StringTokenizer st = new StringTokenizer(bf.readLine()); + arr = Arrays.stream(arr) + .map(i -> Integer.parseInt(st.nextToken())) + .sorted() + .toArray(); + } + + dfs(0); + String collected = ans.stream().collect(Collectors.joining()); + System.out.println(collected); + } + + static void dfs(int depth) { + if (depth == M) { + StringBuilder intSb = new StringBuilder(); + Arrays.stream(selected).forEach(i -> intSb.append(i+" ")); + intSb.append("\n"); + ans.add(intSb.toString()); + return; + } + + for (int i = 0; i < N; i++) { + if (visited[i]) continue; + + selected[depth] = arr[i]; + visited[i] = true; + dfs(depth + 1); + visited[i] = false; + } + } +} diff --git a/src/backtracking/Boj15664.java b/src/backtracking/Boj15664.java new file mode 100644 index 0000000..e337315 --- /dev/null +++ b/src/backtracking/Boj15664.java @@ -0,0 +1,57 @@ +package backtracking; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.Arrays; +import java.util.StringTokenizer; + +// https://www.acmicpc.net/problem/15664 +// N과 M (10) +public class Boj15664 { + static int N; + static int M; + static int[] arr; + static int[] selected; + static StringBuilder sb; + + public static void main(String[] args) throws IOException { + BufferedReader bf = new BufferedReader(new InputStreamReader(System.in)); + { + StringTokenizer st = new StringTokenizer(bf.readLine()); + N = Integer.parseInt(st.nextToken()); + M = Integer.parseInt(st.nextToken()); + arr = new int[N]; + selected = new int[M]; + } + { + StringTokenizer st = new StringTokenizer(bf.readLine()); + arr = Arrays.stream(arr) + .map(i -> Integer.parseInt(st.nextToken())) + .sorted() + .toArray(); + } + + sb = new StringBuilder(); + dfs(0, 0); + System.out.println(sb.toString()); + } + + static void dfs(int depth, int now) { + if (depth == M) { + Arrays.stream(selected).forEach(i -> sb.append(i + " ")); + sb.append("\n"); + return; + } + int before = 0; + + for (int i = now; i < N; i++) { + if (before != arr[i]) { + selected[depth] = arr[i]; + before = arr[i]; + dfs(depth + 1, i + 1); + } + + } + } +} diff --git a/src/backtracking/Boj15665.java b/src/backtracking/Boj15665.java new file mode 100644 index 0000000..14820a0 --- /dev/null +++ b/src/backtracking/Boj15665.java @@ -0,0 +1,53 @@ +package backtracking; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.Arrays; +import java.util.StringTokenizer; + +// https://www.acmicpc.net/problem/15665 +// N과 M (11) +public class Boj15665 { + static int N; + static int M; + static int[] arr; + static int[] selected; + static StringBuilder sb; + + public static void main(String[] args) throws IOException { + BufferedReader bf = new BufferedReader(new InputStreamReader(System.in)); + { + StringTokenizer st = new StringTokenizer(bf.readLine()); + N = Integer.parseInt(st.nextToken()); + M = Integer.parseInt(st.nextToken()); + arr = new int[N]; + selected = new int[M]; + } + { + StringTokenizer st = new StringTokenizer(bf.readLine()); + arr = Arrays.stream(arr) + .map(i -> Integer.parseInt(st.nextToken())) + .sorted() + .toArray(); + } + sb = new StringBuilder(); + dfs(0); + System.out.println(sb); + } + static void dfs(int depth) { + if (depth == M) { + Arrays.stream(selected).forEach(i -> sb.append(i + " ")); + sb.append("\n"); + return; + } + int before = 0; + for (int i = 0; i < N; i++) { + if (before == arr[i]) continue; + before = arr[i]; + selected[depth] = arr[i]; + dfs(depth + 1); + } + } + +} diff --git a/src/backtracking/Boj15666.java b/src/backtracking/Boj15666.java new file mode 100644 index 0000000..792c0a5 --- /dev/null +++ b/src/backtracking/Boj15666.java @@ -0,0 +1,54 @@ +package backtracking; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.Arrays; +import java.util.StringTokenizer; + +// https://www.acmicpc.net/problem/15666 +// N과 M (12) +public class Boj15666 { + static int N; + static int M; + static int[] arr; + static int[] selected; + static StringBuilder sb; + + public static void main(String[] args) throws IOException { + BufferedReader bf = new BufferedReader(new InputStreamReader(System.in)); + { + StringTokenizer st = new StringTokenizer(bf.readLine()); + N = Integer.parseInt(st.nextToken()); + M = Integer.parseInt(st.nextToken()); + arr = new int[N]; + selected = new int[M]; + } + { + StringTokenizer st = new StringTokenizer(bf.readLine()); + arr = Arrays.stream(arr) + .map(i -> Integer.parseInt(st.nextToken())) + .sorted().toArray(); + } + sb = new StringBuilder(); + dfs(0, 0); + System.out.println(sb); + } + + static void dfs(int depth, int now) { + if (depth == M) { + Arrays.stream(selected).forEach(i -> sb.append(i + " ")); + sb.append("\n"); + return; + } + int before = 0; + + for (int i = now; i < N; i++) { + if (before == arr[i]) continue; + + before = arr[i]; + selected[depth] = arr[i]; + dfs(depth + 1, i); + } + } +} From 2b510bb8a549a35fba8fad53d5062dedc13c129a Mon Sep 17 00:00:00 2001 From: kwonghyun Date: Sun, 31 Mar 2024 04:56:24 +0900 Subject: [PATCH 3/3] =?UTF-8?q?=EB=B0=B1=ED=8A=B8=EB=9E=98=ED=82=B9=20-=20?= =?UTF-8?q?=EC=86=8C=EB=AC=B8=EB=82=9C=20=EC=B9=A0=EA=B3=B5=EC=A3=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/backtracking/Boj1941.java | 102 ++++++++++++++++++++++++++++++++++ 1 file changed, 102 insertions(+) create mode 100644 src/backtracking/Boj1941.java diff --git a/src/backtracking/Boj1941.java b/src/backtracking/Boj1941.java new file mode 100644 index 0000000..74b430f --- /dev/null +++ b/src/backtracking/Boj1941.java @@ -0,0 +1,102 @@ +package backtracking; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.LinkedList; +import java.util.Queue; +// TODO 다시 볼것 +// https://www.acmicpc.net/problem/1941 +// 소문난 칠공주 +public class Boj1941 { + static boolean[][] map = new boolean[5][5];; + static int ansCnt = 0; + static int[] selectedNode; + static int[] dr = new int[]{1, -1, 0, 0}; + static int[] dc = new int[]{0, 0, 1, -1}; + static boolean[] visited = new boolean[7]; + public static void main(String[] args) throws IOException { + BufferedReader bf = new BufferedReader(new InputStreamReader(System.in)); + for (int i = 0; i < 5; i++) { + String line = bf.readLine(); + for (int j = 0; j < 5; j++) { + map[i][j] = line.charAt(j) == 'S'; + } + } + selectedNode = new int[7]; + + dfs(0, 0); + + System.out.println(ansCnt); + + } + + static void dfs(int depth, int now) { + if (depth == 7) { + visited = new boolean[7]; + if (isConnected()) { + ansCnt++; + } + return; + } + for (int i = now; i < 25 - 6 + depth; i++) { + + selectedNode[depth] = i; + if (isValid(depth)) { + dfs(depth + 1, i + 1); + } + + } + + + + } + static boolean isConnected() { + + Queue q = new LinkedList<>(); + q.add(new int[] {selectedNode[0]/5, selectedNode[0]%5}); //가장 처음 slected[0] 넣기 + visited[0] = true; + int conn = 1; //몇개 연결되어있는지 + + while(!q.isEmpty()) { + int[] cur = q.poll(); + int r = cur[0]; + int c = cur[1]; + + for(int i = 0 ; i < 4 ; i++) { + int nr = r + dr[i]; + int nc = c + dc[i]; + int ni = nr*5 + nc; //0~24의 다음 index + + if( + !(nr < 5 && nr >=0 + && nc < 5 && nc >=0) + ) continue; + for(int j = 0 ; j < 7 ; j++) { + if(!visited[j] && selectedNode[j] == ni) { + q.add(new int[] {nr, nc}); + visited[j] = true; + conn++; + } + } + } + } + + return conn == 7; + } + + static boolean isValid(int depth) { + if (depth < 3) { + return true; + } + int yCnt = 0; + + for (int i = 0; i <= depth; i++) { + if (!getValueFromNode(selectedNode[i])) yCnt++; + } + return yCnt < 4; + } + static boolean getValueFromNode(int node) { + return map[node / 5][node % 5]; + } +}