diff --git "a/personal/JAEHEE25/PGS/\353\254\270\354\236\220\354\227\264_\354\225\225\354\266\225.java" "b/personal/JAEHEE25/PGS/\353\254\270\354\236\220\354\227\264_\354\225\225\354\266\225.java" new file mode 100644 index 0000000..964d6fe --- /dev/null +++ "b/personal/JAEHEE25/PGS/\353\254\270\354\236\220\354\227\264_\354\225\225\354\266\225.java" @@ -0,0 +1,46 @@ +import java.util.*; + +class Solution { + public int solution(String s) { + int answer = Integer.MAX_VALUE; + int len = 1; //단위 + int N = s.length(); + + while (len <= N) { + StringBuilder resultBuilder = new StringBuilder(); + StringBuilder wordBuilder = new StringBuilder(); + String prev = ""; + String word = ""; + int cnt = 0; + for (int i = 0; i <= N; i++) { + word = wordBuilder.toString(); + if (word.length() == len) { + if (prev.equals("")) { //맨 처음일 경우 prev에 저장 + prev = word; + cnt++; + } else if (prev.equals(word)) { //연속된 단어일 경우 개수 카운트 + cnt++; + } else { //새로운 단어일 경우 이전 단어 기록 + if (cnt <= 1) resultBuilder.append(prev); + else resultBuilder.append(cnt + prev); + prev = word; + cnt = 1; + } + wordBuilder = new StringBuilder(); //초기화 + } + if (i < N) wordBuilder.append(s.charAt(i)); + } + + //마지막 처리 + if (cnt <= 1) resultBuilder.append(prev); + else resultBuilder.append(cnt + prev); + resultBuilder.append(wordBuilder.toString()); //남은 글자들 + + //정답 구하기 + answer = Math.min(resultBuilder.length(), answer); + len++; + } + + return answer; + } +} diff --git "a/weekly/week05/BOJ_14002_\352\260\200\354\236\245\352\270\264\354\246\235\352\260\200\355\225\230\353\212\224\353\266\200\353\266\204\354\210\230\354\227\2644/JAEHEE25.java" "b/weekly/week05/BOJ_14002_\352\260\200\354\236\245\352\270\264\354\246\235\352\260\200\355\225\230\353\212\224\353\266\200\353\266\204\354\210\230\354\227\2644/JAEHEE25.java" new file mode 100644 index 0000000..9181d79 --- /dev/null +++ "b/weekly/week05/BOJ_14002_\352\260\200\354\236\245\352\270\264\354\246\235\352\260\200\355\225\230\353\212\224\353\266\200\353\266\204\354\210\230\354\227\2644/JAEHEE25.java" @@ -0,0 +1,50 @@ +package week05.BOJ_14002_가장긴증가하는부분수열4; + +import java.util.*; +import java.lang.*; +import java.io.*; + +class BOJ14002 { + public static void main(String[] args) throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + int N = Integer.parseInt(br.readLine()); + StringTokenizer st = new StringTokenizer(br.readLine()); + int[] arr = new int[N]; + for (int i = 0; i < N; i++) { + arr[i] = Integer.parseInt(st.nextToken()); + } + + int[] dp = new int[N]; + for (int i = 0; i < N; i++) { + dp[i] = 1; + for (int j = 0; j < i; j++) { + if (arr[j] < arr[i]) { + dp[i] = Math.max(dp[i], dp[j] + 1); + } + } + } + + StringBuilder answer = new StringBuilder(); + int max = 0; + for (int i = 0; i < N; i++) { + if (dp[i] > max) { + max = dp[i]; + } + } + answer.append(max).append("\n"); + + Stack stack = new Stack<>(); + for (int i = N - 1; i >= 0; i--) { + if (dp[i] == max) { + stack.push(arr[i]); + max--; + } + } + + while (!stack.isEmpty()) { + answer.append(stack.pop()).append(" "); + } + + System.out.println(answer); + } +} diff --git "a/weekly/week05/BOJ_14002_\352\260\200\354\236\245\352\270\264\354\246\235\352\260\200\355\225\230\353\212\224\353\266\200\353\266\204\354\210\230\354\227\2644/whqtker.java" "b/weekly/week05/BOJ_14002_\352\260\200\354\236\245\352\270\264\354\246\235\352\260\200\355\225\230\353\212\224\353\266\200\353\266\204\354\210\230\354\227\2644/whqtker.java" new file mode 100644 index 0000000..80417cb --- /dev/null +++ "b/weekly/week05/BOJ_14002_\352\260\200\354\236\245\352\270\264\354\246\235\352\260\200\355\225\230\353\212\224\353\266\200\353\266\204\354\210\230\354\227\2644/whqtker.java" @@ -0,0 +1,80 @@ +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.ArrayDeque; +import java.util.Arrays; +import java.util.Queue; +import java.util.Stack; +import java.util.StringTokenizer; + +public class Main { + + public static void main(String[] args) throws IOException { + + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + StringBuilder sb = new StringBuilder(); + + int n = Integer.parseInt(br.readLine()); + + int[] arr = new int[n]; + int[] dp = new int[n]; + int[] rev = new int[n]; // 역추적 배열 + + for (int i = 0; i < n; i++) { + rev[i] = -1; + } + + String line = br.readLine(); + StringTokenizer st = new StringTokenizer(line); + for (int i = 0; i < n; i++) { + arr[i] = Integer.parseInt(st.nextToken()); + } + + dp[0] = 1; + int maxVal = 0; + int maxIdx = 0; + for (int i = 0; i < n; i++) { + int prevVal = 0; + int prevIdx = 0; + for (int j = 0; j < i; j++) { + if (arr[i] > arr[j]) { + if (prevVal < dp[j]) { + prevVal = dp[j]; + prevIdx = j; + } + } + } + + dp[i] = prevVal + 1; + if (prevVal == 0) { + rev[i] = -1; + } + else { + rev[i] = prevIdx; + } + + // 최댓값 갱신 + if (maxVal < dp[i]) { + maxVal = dp[i]; + maxIdx = i; + } + } + + sb.append(maxVal).append("\n"); + + int idx = maxIdx; + int[] ans = new int[maxVal]; + int ansIdx = 0; + while (idx != -1) { + ans[ansIdx] = arr[idx]; + idx = rev[idx]; + ansIdx++; + } + + for (int i = maxVal - 1; i >= 0; i--) { + sb.append(ans[i]).append(' '); + } + + System.out.print(sb); + } +} diff --git "a/weekly/week05/BOJ_1781_\354\273\265\353\235\274\353\251\264/JAEHEE25.java" "b/weekly/week05/BOJ_1781_\354\273\265\353\235\274\353\251\264/JAEHEE25.java" new file mode 100644 index 0000000..bbbe95c --- /dev/null +++ "b/weekly/week05/BOJ_1781_\354\273\265\353\235\274\353\251\264/JAEHEE25.java" @@ -0,0 +1,43 @@ +package week05.BOJ_1781_컵라면; +import java.util.*; +import java.lang.*; +import java.io.*; + +class BOJ1781 { + public static void main(String[] args) throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + int N = Integer.parseInt(br.readLine()); + int[][] works = new int[N][2]; //데드라인, 컵라면 수 + for (int i = 0; i < N; i++) { + StringTokenizer st = new StringTokenizer(br.readLine()); + works[i][0] = Integer.parseInt(st.nextToken()); + works[i][1] = Integer.parseInt(st.nextToken()); + } + + Arrays.sort(works, (o1, o2) -> { + if (o1[0] == o2[0]) return o2[1] - o1[1]; + return o1[0] - o2[0]; + }); + + PriorityQueue pq = new PriorityQueue<>(); //푼 문제의 컵라면 수 저장 + for (int i = 0; i < N; i++) { + + //pq 사이즈 == 푼 문제 수 == 사용한 시간과 데드라인 시간 비교 + if (pq.size() < works[i][0]) { + pq.offer(works[i][1]); + } else { + if (pq.peek() < works[i][1]) { //기존에 풀었던 문제의 컵라면 수보다 크면 교체 + pq.poll(); + pq.offer(works[i][1]); + } + } + } + + //출력 + int answer = 0; + while (!pq.isEmpty()) { + answer += pq.poll(); + } + System.out.println(answer); + } +} diff --git "a/weekly/week05/BOJ_1781_\354\273\265\353\235\274\353\251\264/sukangpunch.java" "b/weekly/week05/BOJ_1781_\354\273\265\353\235\274\353\251\264/sukangpunch.java" new file mode 100644 index 0000000..9d7599d --- /dev/null +++ "b/weekly/week05/BOJ_1781_\354\273\265\353\235\274\353\251\264/sukangpunch.java" @@ -0,0 +1,70 @@ +package study.week05; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.PriorityQueue; + +// 컵라면 +public class BOJ_1781 { + + static class Problem implements Comparable { + + int deadLine; + int cup; + + public Problem(int deadLine, int cup) { + this.deadLine = deadLine; + this.cup = cup; + } + + @Override + public int compareTo(Problem o) { + if (this.deadLine == o.deadLine) { + return o.cup - this.cup; + } + return this.deadLine - o.deadLine; + } + } + + static PriorityQueue pq; + static int N; + + public static void main(String[] args) throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + + N = Integer.parseInt(br.readLine()); + pq = new PriorityQueue<>(); + + for (int i = 0; i < N; i++) { + String[] s = br.readLine().split(" "); + int deadLine = Integer.parseInt(s[0]); + int cup = Integer.parseInt(s[1]); + pq.add(new Problem(deadLine, cup)); + } + + PriorityQueue select = new PriorityQueue<>(); + + while(!pq.isEmpty()){ + Problem problem = pq.poll(); + int deadLine = problem.deadLine; + int cup = problem.cup; + + if(select.size() < deadLine){ + select.offer(cup); + }else{ + if(!select.isEmpty() && select.peek() < cup){ // 만약 선택한 문제 중 가장 적은 컵라면보다 현재 추가하려는 problem 의 컵라면 개수가 더 많다면 + select.poll(); + select.offer(cup); + } + } + } + + long result = 0; + for(int cup : select){ + result += cup; + } + + System.out.println(result); + } +} diff --git "a/weekly/week05/BOJ_1781_\354\273\265\353\235\274\353\251\264/whqtker.cpp" "b/weekly/week05/BOJ_1781_\354\273\265\353\235\274\353\251\264/whqtker.cpp" new file mode 100644 index 0000000..57f8dac --- /dev/null +++ "b/weekly/week05/BOJ_1781_\354\273\265\353\235\274\353\251\264/whqtker.cpp" @@ -0,0 +1,44 @@ +#include +#include +#include +#include + +using namespace std; + +int main() { + int n; + cin >> n; + + vector> v; + for (int i = 0; i < n; i++) { + int a, b; + cin >> a >> b; + v.push_back({ a,b }); + } + + // 데드라인 순으로 정렬 + sort(v.begin(), v.end()); + + // 처리 가능한 과제 저장 + priority_queue,greater> pq; + + for (int i = 0; i < n; i++) { + int deadline = v[i].first; + int cnt = v[i].second; + pq.push(cnt); + + // 데드라인을 초과하는 경우 가장 개수가 작은 것을 버린다. + // v[i]를 처리하기 위해서는 pq의 크기가 deadline보다 작거나 같아야 한다. + if (pq.size() > deadline) { + pq.pop(); + } + } + + long long ans = 0; + while (!pq.empty()) { + ans += pq.top(); + pq.pop(); + } + + cout << ans; +} \ No newline at end of file diff --git "a/weekly/week05/BOJ_6236_\354\232\251\353\217\210\352\264\200\353\246\254/JAEHEE25.java" "b/weekly/week05/BOJ_6236_\354\232\251\353\217\210\352\264\200\353\246\254/JAEHEE25.java" new file mode 100644 index 0000000..7e956fd --- /dev/null +++ "b/weekly/week05/BOJ_6236_\354\232\251\353\217\210\352\264\200\353\246\254/JAEHEE25.java" @@ -0,0 +1,51 @@ +package week05.BOJ_6236_용돈관리; + +import java.util.*; +import java.lang.*; +import java.io.*; + +class BOJ6236 { + public static void main(String[] args) throws IOException { + 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[] money = new int[N]; + int max = 0; + for (int i = 0; i < N; i++) { + money[i] = Integer.parseInt(br.readLine()); + max = Math.max(money[i], max); //최대 금액을 최솟값으로 설정 + } + + int answer = 0; + int left = max; + int right = 10000 * 100000; + while (left <= right) { + int K = (left + right) / 2; + + //결과 계산 + int result = getWithdrawCnt(money, K, M); + + if (M >= result) { + answer = K; + right = K - 1; + } else { + left = K + 1; + } + } + System.out.println(answer); + } + + static int getWithdrawCnt(int[] money, int K, int M) { + int withdrawCnt = 1; + int now = K; + for (int i = 0; i < money.length; i++) { + if (money[i] > now) { //모자라면 K원 인출 + withdrawCnt++; + now = K; + } + now -= money[i]; + } + return withdrawCnt; + } +} diff --git "a/weekly/week05/BOJ_6236_\354\232\251\353\217\210\352\264\200\353\246\254/whqtker.cpp" "b/weekly/week05/BOJ_6236_\354\232\251\353\217\210\352\264\200\353\246\254/whqtker.cpp" new file mode 100644 index 0000000..55de798 --- /dev/null +++ "b/weekly/week05/BOJ_6236_\354\232\251\353\217\210\352\264\200\353\246\254/whqtker.cpp" @@ -0,0 +1,63 @@ +#include +#include + +using namespace std; + +int n, m; +int arr[100000]; + +// x원 인출하는 경우 m번 이하로 가능한가 ? +bool able(int x) { + int target = x; + int cnt = 1; // 인출 횟수, 처음 한 번 인출함 + + for (int i = 0; i < n; i++) { + target -= arr[i]; + + // 인출 안해도 되는 상황 + if (target >= 0) { + continue; + } + else { + cnt++; + target = x - arr[i]; + + // 만약 인출했으나 현재 사용 불가능한 경우 + if (target < 0) { + return false; + } + } + } + + return cnt <= m; +} + +int main() { + cin.tie(0); + ios::sync_with_stdio(0); + + cin >> n >> m; + + int left = 0; + int right = 0; + for (int i = 0; i < n; i++) { + cin >> arr[i]; + right += arr[i]; + } + + int ans = 2e9; + while (left <= right) { + int mid = (left + right) / 2; + + // mid원으로 m번 이하로 인출 가능하다면 더 작은 금액 시도 + if (able(mid)) { + ans = min(ans, mid); + right = mid - 1; + } + else { + left = mid + 1; + } + } + + cout << ans; +} \ No newline at end of file diff --git "a/weekly/week06/BOJ_17070_\355\214\214\354\235\264\355\224\204\354\230\256\352\270\260\352\270\2601/JAEHEE25.java" "b/weekly/week06/BOJ_17070_\355\214\214\354\235\264\355\224\204\354\230\256\352\270\260\352\270\2601/JAEHEE25.java" new file mode 100644 index 0000000..e181834 --- /dev/null +++ "b/weekly/week06/BOJ_17070_\355\214\214\354\235\264\355\224\204\354\230\256\352\270\260\352\270\2601/JAEHEE25.java" @@ -0,0 +1,63 @@ +package week06.BOJ_17070_파이프옮기기1; + +import java.util.*; +import java.lang.*; +import java.io.*; + +class BOJ17070 { + static final int WALL = 1; + static int answer = 0; + static int N; + static int[][] house; + public static void main(String[] args) throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + N = Integer.parseInt(br.readLine()); + house = new int[N][N]; + for (int i = 0; i < N; i++) { + StringTokenizer st = new StringTokenizer(br.readLine()); + for (int j = 0; j < N; j++) { + house[i][j] = Integer.parseInt(st.nextToken()); + } + } + move(0, 1, 'H'); //0,1에서 시작 + System.out.println(answer); + } + + static void move(int x, int y, char dir) { + //각 dir에 따라 갈 방법이 없으면 return + if (dir == 'H' || dir == 'V') { + if (!isPossible(x, y) || house[x][y] == WALL) { + return; + } + } else { + if (!isPossible(x, y) || !isPossible(x-1, y) || !isPossible(x, y-1) || + house[x][y] == WALL || house[x-1][y] == WALL || house[x][y-1] == WALL) { + return; + } + } + + if (x == N - 1 && y == N - 1) { //도착 + answer++; + return; + } + + if (dir == 'H') { //가로 이동 + move(x, y+1, 'H'); //1번 + move(x+1, y+1, 'D'); //2번 + + } else if (dir == 'V') { //세로 이동 + move(x+1, y, 'V'); //1번 + move(x+1, y+1, 'D'); //2번 + + } else { //대각선 이동 + move(x, y+1, 'H'); //1번 + move(x+1, y, 'V'); //2번 + move(x+1, y+1, 'D'); //3번 + } + + } + + static boolean isPossible(int x, int y) { + return x >= 0 && x < N && y >= 0 && y < N; + } +} diff --git "a/weekly/week06/BOJ_17070_\355\214\214\354\235\264\355\224\204\354\230\256\352\270\260\352\270\2601/sukangpunch.java" "b/weekly/week06/BOJ_17070_\355\214\214\354\235\264\355\224\204\354\230\256\352\270\260\352\270\2601/sukangpunch.java" new file mode 100644 index 0000000..aaf0fe7 --- /dev/null +++ "b/weekly/week06/BOJ_17070_\355\214\214\354\235\264\355\224\204\354\230\256\352\270\260\352\270\2601/sukangpunch.java" @@ -0,0 +1,92 @@ +package study.week06; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; + +// 파이프 옮기기 +// dp +/** + * 방금 전에 해당 문제와 거의 동일한 17484 문제를 풀었어서 바로 풀 수 있었다. + * 3차원 dp 배열을 두고 0-가로, 1-세로, 2-대각선 인 경우의 수들을 관리하였다. + * 가로부터 시작하므로, 시작점 가로 상황에서 가능한 경우의 수로 dp 값을 초기화 + * 모든 좌표를 확인하되, 반복문 안에서, 가로, 세로, 대각선인 상황 모두를 고려하는 반복문 하나를 더 활용 + * 가로 일때는 오른쪽, 대각선 이동이 가능하므로, 바뀌는 상태에 따라서 값을 더해준다. + * 위처럼 각 파이프 상태별로 가능한 연산을 해주면 마지막에 상태별로 가능한 경우의 수들이 남고, 이를 더해주면 된다. + */ +public class BOJ_17070 { + + public static void main(String[] args) throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + int N = Integer.parseInt(br.readLine()); + + int [][] map = new int[N][N]; + int [][][] dp = new int[N][N][3]; + + for(int i=0; i 출력 + StringBuilder sb = new StringBuilder(); + for(int i = 0; i < N; i++){ + for(int j = 0; j < N; j++){ + sb.append(board[i][j]).append(' '); + } + sb.append("\n"); + } + System.out.println(sb); + System.exit(0); //하나만 출력해야하기 때문에 시스템 종료 + } + + if (board[x][y] == 0) { //빈칸일 경우 + for (int num = 1; num <= N; num++) { //1~9 중 가능한 수 찾기 + if (checkPossible(x, y, num)) { + board[x][y] = num; //가능한 수 빈칸에 넣기 + sudoku(x, y + 1); //다음 칸 확인 + board[x][y] = 0; //다시 빈 칸으로 처리 + } + } + } else { //빈칸이 아닐 경우 다음 칸 확인 + sudoku(x, y + 1); + } + } + + static boolean checkPossible(int x, int y, int value) { //value가 있는지 검사 + //행 검사 + for (int i = 0; i < N; i++) { + if (board[x][i] == value) { + return false; + } + } + + //열 검사 + for (int i = 0; i < N; i++) { + if (board[i][y] == value) { + return false; + } + } + + //정사각형 검사 + int sx = (x / 3) * 3; + int sy = (y / 3) * 3; + for (int i = sx; i < sx + 3; i++) { + for (int j = sy; j < sy + 3; j++) { + if (board[i][j] == value) { + return false; + } + } + } + return true; + } + +} diff --git "a/weekly/week06/BOJ_2580_\354\212\244\353\217\204\354\277\240/sukangpunch.java" "b/weekly/week06/BOJ_2580_\354\212\244\353\217\204\354\277\240/sukangpunch.java" new file mode 100644 index 0000000..9e60066 --- /dev/null +++ "b/weekly/week06/BOJ_2580_\354\212\244\353\217\204\354\277\240/sukangpunch.java" @@ -0,0 +1,97 @@ +package it_company_work_book.silver; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; + +// 스도쿠 +// 구현, 백트래킹 +/** + * 답 확인 + * 백트래킹 문제임은 알았는데, 구현 못했음 + * 인덱스 0, 0 ~ 8,8 까지 재귀로 구현한다. + * 세로, 가로, 3x3 을 확인하고 가능하면 다음스텝, 불가능하면 빽 + * 8,8 까지 순회 했다면, 알맞게 채운 것이므로 종료 + */ +public class BOJ_2580 { + + static int [][] map; + static int size; + + public static void main(String[] args) throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + + map = new int[9][9]; + + for(int i=0; i<9; i++){ + String []s = br.readLine().split(" "); + for(int j=0; j<9; j++){ + int num = Integer.parseInt(s[j]); + map[i][j] = num; + } + } + + backtrack(0,0); + } + + private static void backtrack(int y, int x) { + if(x == 9){ + backtrack(y+1, 0); + return; + } + + if(y == 9){ + StringBuilder sb = new StringBuilder(); + for(int i=0; i<9; i++){ + for(int j=0; j<9; j++){ + sb.append(map[i][j]).append(" "); + } + sb.append("\n"); + } + System.out.println(sb); + System.exit(0); + } + + if(map[y][x] == 0){ + for(int i=1; i<=9; i++){ + if(check(y, x, i)){ + map[y][x] = i; + backtrack(y, x+1); + } + } + map[y][x] = 0; + return; + } + + backtrack(y, x+1); + } + + private static boolean check(int y, int x, int value) { + + for(int i=0; i<9; i++){ + if(map[y][i] == value){ + return false; + } + } + + for(int i=0; i<9; i++){ + if(map[i][x] == value){ + return false; + } + } + + // 같은 네모를 보기 위함 + int tmpY = (y/3) * 3; + int tmpX = (x/3) * 3; + + for(int i = tmpY; i zeros = new Vector<>(); + static int[][] arr; + + static class Coor { + int x; + int y; + + Coor(int x, int y) { + this.x = x; + this.y = y; + } + } + + static void printArr() { + for (int i = 0; i < 9; i++) { + for (int j = 0; j < 9; j++) { + sb.append(arr[i][j]).append(' '); + } + sb.append("\n"); + } + + System.out.println(sb); + } + + static boolean col(int num, int x, int y) { + for (int i = 0; i < 9; i++) { + if (arr[x][i] == num) { + return false; + } + } + + return true; + } + + static boolean row(int num, int x, int y) { + for (int i = 0; i < 9; i++) { + if (arr[i][y] == num) { + return false; + } + } + + return true; + } + + static boolean square(int num, int x, int y) { + int sx = (x / 3) * 3; + int sy = (y / 3) * 3; + + for (int i = sx; i < sx + 3; i++) { + for (int j = sy; j < sy + 3; j++) { + if (arr[i][j] == num) { + return false; + } + } + } + + return true; + } + + static boolean ok(int num, int x, int y) { + return col(num, x, y) && row(num, x, y) && square(num, x, y); + } + + static void dfs(int cnt) { + if (cnt == zeros.size()) { + printArr(); + System.exit(0); + } + + Coor cur = zeros.get(cnt); + + for (int i = 1; i <= 9; i++) { + if (ok(i, cur.x, cur.y)) { + arr[cur.x][cur.y] = i; + + dfs(cnt + 1); + + arr[cur.x][cur.y] = 0; + } + } + } + + public static void main(String[] args) throws IOException { + + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + + arr = new int[9][9]; + + for (int i = 0; i < 9; i++) { + String line = br.readLine(); + StringTokenizer st = new StringTokenizer(line); + for (int j = 0; j < 9; j++) { + arr[i][j] = Integer.parseInt(st.nextToken()); + + if (arr[i][j] == 0) { + zeros.add(new Coor(i, j)); + } + } + } + + dfs(0); + } +} diff --git "a/weekly/week06/PGS_\354\232\224\352\262\251\354\213\234\354\212\244\355\205\234/JAEHEE25.java" "b/weekly/week06/PGS_\354\232\224\352\262\251\354\213\234\354\212\244\355\205\234/JAEHEE25.java" new file mode 100644 index 0000000..fed70ca --- /dev/null +++ "b/weekly/week06/PGS_\354\232\224\352\262\251\354\213\234\354\212\244\355\205\234/JAEHEE25.java" @@ -0,0 +1,24 @@ +package week06.PGS_요격시스템; + +import java.util.*; +class Solution { + public int solution(int[][] targets) { + int answer = 0; + Arrays.sort(targets, (o1, o2) -> o1[0] - o2[0]); + + int start = -1; //현재 요격 미사일의 범위 + int end = 100_000_001; + for (int i = 0; i < targets.length; i++) { + if (targets[i][0] >= end) { + answer++; + start = -1; + end = 100_000_001; + } + start = Math.max(start, targets[i][0]); + end = Math.min(end, targets[i][1]); + } + + answer++; + return answer; + } +} diff --git "a/weekly/week06/PGS_\354\232\224\352\262\251\354\213\234\354\212\244\355\205\234/sukangpunch.java" "b/weekly/week06/PGS_\354\232\224\352\262\251\354\213\234\354\212\244\355\205\234/sukangpunch.java" new file mode 100644 index 0000000..1c5c4c7 --- /dev/null +++ "b/weekly/week06/PGS_\354\232\224\352\262\251\354\213\234\354\212\244\355\205\234/sukangpunch.java" @@ -0,0 +1,72 @@ +package study.week06; + +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.util.ArrayList; +import java.util.List; + +// 요격 시스템 +// 그리디, 구간 스케쥴링 +// 시간복잡도 : O(NlogN) +/** + * 답지 봄 + * 그리디 라는건 알았으나, 정렬 기준과 로직을 떠올리지 못했다. + * 가장 일찍 끝나는 지점에 요격하면 그 지점을 지나는 다른 구간들도 동시에 커버 가능하다. + * end가 늦은 구간으로 요격하면, 일찍 끝나는 구간들은 이미 통과해버려 별도 요격이 필요해지기 때문. + * end 를 기준으로 정렬하고 pre 값보다 start 값이 크다면 answer 증가, pre = now.end 로 업데이트 + * start >= pre 일 때, 새로 요격하는 이유는, 개구간 이기 때문에 end == start 라면 요격이 불가능해진다. + * 즉, end 기준 정렬은 가장 빨리 사라질 구간부터 처리 하는 전략 + */ +public class PGS_181188 { + + public static void main(String[] args) { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + + int [][]target = new int[][]{ + {4,5}, + {4,8}, + {10,14}, + {11,13}, + {5,12}, + {3,7}, + {1,4} + }; + + int result = solution(target); + System.out.println(result); + } + + static class Missile implements Comparable{ + int start; + int end; + + public Missile(int start, int end){ + this.start = start; + this.end = end; + } + + @Override + public int compareTo(Missile o) { + return this.end - o.end; + } + } + + static int solution(int[][] targets) { + int answer = 0; + List missiles = new ArrayList<>(); + for(int i=0; i=i){ + dp[j] += dp[j-i]; + } + } + } + sb.append(dp[N]).append("\n"); + } + + System.out.println(sb); + } +} diff --git "a/weekly/week08/BOJ_2531_\355\232\214\354\240\204\354\264\210\353\260\245/.gitkeep" "b/weekly/week08/BOJ_2531_\355\232\214\354\240\204\354\264\210\353\260\245/.gitkeep" new file mode 100644 index 0000000..0e30c04 --- /dev/null +++ "b/weekly/week08/BOJ_2531_\355\232\214\354\240\204\354\264\210\353\260\245/.gitkeep" @@ -0,0 +1 @@ +# 이번 주도 파이팅!🔥 \ No newline at end of file diff --git "a/weekly/week08/BOJ_2531_\355\232\214\354\240\204\354\264\210\353\260\245/sukangpunch.java" "b/weekly/week08/BOJ_2531_\355\232\214\354\240\204\354\264\210\353\260\245/sukangpunch.java" new file mode 100644 index 0000000..652cd82 --- /dev/null +++ "b/weekly/week08/BOJ_2531_\355\232\214\354\240\204\354\264\210\353\260\245/sukangpunch.java" @@ -0,0 +1,75 @@ +package it_company_work_book.silver; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; + +// 회전초밥 +// 투포인터, 브루트포스, 슬라이딩 윈도우 +/** + * 현 윈도우 상태에 맞게 현재 먹은 스시 개수 및 중복을 처리할 sushiCounts 배열을 두고, + * 중복과 쿠폰을 고려해서 겹치지 않는 스시 개수를 구할 uniqueCount 을 둔다. + * 초기 슬라이딩 윈도우 값을 구한 다음, 해당 값에서 인덱스를 1씩 이동해가며 윈도우의 처음 인덱스 값을 윈도우의 다음 인덱스를 추가한다. + * 원형 배열이기 때문에 %연산을 통해서 범위를 지정한다. + */ +public class BOJ_2531 { + + public static void main(String[] args) throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + + String []s = br.readLine().split(" "); + int N = Integer.parseInt(s[0]); + int d = Integer.parseInt(s[1]); + int k = Integer.parseInt(s[2]); + int c = Integer.parseInt(s[3]); + + int [] dishes = new int[N]; + + for(int i=0; i -#include -#include - -using namespace std; - -vector v; - -// 휴게소 간 최대 거리를 x로 했을 때, 설치 가능한 휴게소의 수를 리턴 -int chk(int x) { - int cnt = 0; - for (int i = 0; i < v.size() - 1; i++) { - int gap = v[i + 1] - v[i]; - - if (gap % x == 0) { - cnt += gap / x - 1; - } - else { - cnt += gap / x; - } - } - - return cnt; -} - -int main() { - int n, m, l; - cin >> n >> m >> l; - - for (int i = 0; i < n; i++) { - int x; - cin >> x; - v.push_back(x); - } - v.push_back(0); - v.push_back(l); - - sort(v.begin(), v.end()); - - int left = 1; - int right = l; - int mid; - while (left <= right) { - mid = (left + right) / 2; // mid: 휴게소 간 최대 거리 - - int cnt = chk(mid); - - if (cnt <= m) { - right = mid - 1; - } - else { - left = mid + 1; - } - } - - cout << left; -} \ No newline at end of file