목록Data Structure & Algorithm/PS - JAVA (270)
Dev.baelanche
배열 한개에 그리는 방식으로 풀었다. 공백 한칸을 비우는 부분만 신경을 잘 써주면 된다. public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int s = sc.nextInt(); String n = sc.next(); int height = 2*s + 3; int width = s + 2; int len = n.length(); char a[][] = new char[height][len * width + len-1]; for(int i=0; i
어느 부분이 반복되는지 한 3분정도 보다가 찾아냈다. *** * * *** 모양을 재귀호출하면서 채워넣어주면 된다. 예제를 생각해보면, 1. 27*27 배열을 9*9 씩 9개로 분할한다. 2. 9개 배열 중 가운데 배열만 공백으로 채우고 나머지는 *로 채운다. 3. 9개 배열을 3*3 씩 9개로 분할한다. 4. 2번과 같이 채운다. 5. 3*3 의 배열을 채우면 정지한다. 위 순서대로 3^n * 3^n 의 배열에서 3등분 하는 방법으로 접근하면 된다. public class Main { static char a[][]; public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); a = ..
2^n * 2^n 의 배열에서 좌상, 우상, 좌하, 우하 순으로 분할하여 접근한다. 재귀를 이용하여 접근한 부분배열의 크기가 2*2 일때까지 접근하여 카운트를 세고 (r, c) 일때의 카운트를 출력해주면 된다. public class Main { static int idx = 0; static int r; static int c; public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int pow = (int)Math.pow(2, n); r = sc.nextInt(); c = sc.nextInt(); recursive(0, 0, pow); } public static void re..
회의실배정 문제와 유사한데 조금 더 꼬아낸 문제다. 모든 수업이 가능해야 하므로 배열 정렬은 시작 시간에 대해 오름차순으로 정렬한다. 진행중이던 강의가 끝나면 그 강의실을 재사용할 수 있으므로 강의 정보를 담을 자료구조가 필요하다. 처음에는 큐를 이용하여 풀었는데 큐에서도 끝나는 시간이 빠른것을 우선으로 비교해야 하므로 우선순위 큐로 구현했다. 진행은 다음과 같다. 1. 강의 정보를 시작 시간에 따라 오름차순으로 정렬한다. 2. 강의 종료 시간을 우선순위 큐에 담는다. 3. 큐의 front 와 현재 강의 정보의 시작시간과 비교하여 시작시간이 크거나 같다면 큐를 pop 한다. (강의실이 비었다) 4. 마지막에 큐의 개수를 센다. 강의 정보를 구조체나 클래스로 구현하여도 되지만 회의실배정 때 소스를 끌어다가..
그리디 알고리즘 문제로 정렬 기준을 잘 잡아야 한다. 회의 정보에 대하여 1. 회의가 끝나는 시간이 가장 빠른순으로 오름차순 정렬한다. 2. 회의가 끝나는 시간이 같은 회의가 있다면 회의 시작시간이 빠른 것을 앞으로 한다. 많은 정렬 방법이 있겠지만 Comparator 를 구현하여 정렬했다. public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int a[][] = new int[n][2]; for(int i=0; i
다음과 같은 규칙을 따라 스택으로 구현해야 한다. 1. A, B, C .... 등의 피연산자는 곧바로 출력한다. 2. +, - 연산자는 push 한다. - 그렇지 않을때는 위 조건이 참이 될때까지 스택을 pop 하며 출력한다. 3. *, / 연산자는 push 한다. - 그렇지 않을때는 위 조건이 참이 될때까지 스택을 pop 하며 출력한다. 4. ( 기호는 push 한다. 5. ) 기호는 스택의 탑이 '(' 이 될때까지 스택을 pop 하며 출력한다. - '(' 기호는 pop 하지만 출력하지는 않는다. 6. 위 절차가 끝나고 스택에 값이 남아있다면 모두 pop 하며 출력한다. public class Main { public static void main(String[] args) { Scanner sc = ..
1780번 문제와 동일한 방식으로 풀면된다. 다만 재귀가 깊어질수록 출력할 숫자 좌우에 괄호를 붙여주어야 하는데, 필자는 큐에 담아서 pop 하는 방식으로 구현했다. public class Main { static char[][] a; static Queue q = new LinkedList(); public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); a = new char[n][n]; for(int i=0; i
분할정복을 사용하는 전형적인 문제이다. 종이의 크기를 9로 예를 들면 1. 9*9 를 탐색한다. 2. 종이가 모두 같은 수로 되어있지 않다면 9등분하여 각 종이를 탐색한다. 3. 2번을 반복하여 -1, 0, 1 의 개수를 센다. 2번이 계속 반복되므로 재귀함수로 짜주기만 하면 된다. 코드를 보고 머리로 그려보는 것이 좋을 것 같다. public class Main { static int a[][]; static int cnt[] = new int[3]; public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); a = new int[n][n]; for(int i=0; i