diff --git "a/parkhayoon/BOJ_11053_\352\260\200\354\236\245\354\246\235\352\260\200\355\225\230\353\212\224\353\266\200\353\266\204\354\210\230\354\227\264.java" "b/parkhayoon/BOJ_11053_\352\260\200\354\236\245\354\246\235\352\260\200\355\225\230\353\212\224\353\266\200\353\266\204\354\210\230\354\227\264.java" new file mode 100644 index 0000000..2e130bc --- /dev/null +++ "b/parkhayoon/BOJ_11053_\352\260\200\354\236\245\354\246\235\352\260\200\355\225\230\353\212\224\353\266\200\353\266\204\354\210\230\354\227\264.java" @@ -0,0 +1,42 @@ +package algo.week01; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.StringTokenizer; + +public class BOJ_11053_가장증가하는부분수열 { + + static int N; // 수열의 길이 N + static int[] arr; // 수열 + static int[] dp; // 선택한 부분 수열의 길이 저장 + + 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()); + arr = new int[N]; + dp = new int[N]; + st = new StringTokenizer(br.readLine()); + for (int i=0; i 오른쪽 + * 도로 사이 길이가 다를 수 있음 + * + * 처음 출발 시 자동차 기름 없어서 주유소에서 기름 넣고 출발 + * 기름통 크기 무제한, 얼마든지 많은 기름을 넣을 수 있음 + * 1km당 1L 기름 사용 + * 각 도시에는 단 하나의 주유소 + * 주유소 마다 리터당 가격이 다를 수 있음 + * 이동 최소 비용 계산 + * + * 입력 + * 첫째 줄: 도시의 개수 N(2 ≤ N ≤ 100,000) + * 다음 줄: 인접한 두 도시를 연결하는 도로의 길이 N-1개 + * 다음 줄: 주유소의 리터당 가격이 제일 왼쪽 도시부터 순서대로 N개의 자연수 + * 제일 왼쪽 도시부터 제일 오른쪽 도시까지의 거리는 1이상 1,000,000,000 이하의 자연수 + * 리터당 가격은 1 이상 1,000,000,000 이하의 자연수 + * + * 출력 + * 제일 왼쪽 도시에서 제일 오른쪽 도시로 가는 최소 비용 + * + * 아이디어 + * A(출발점) -> C(경유지 : A-B 사이에서 최솟값) -> B(도착점) + * 최솟값 = PriceA * Dist(C-A) + PriceC * Dist(B-C) + * 1) A-C 구간 : A-C 구간 최솟값 찾고 위 과정 반복 + * A-D-C 최솟값 = PriceA * Dist(D-A) + PriceD * Dist(C-D) 갱신 + * 2) C-B 구간 : 최소값 고정 + * + * 풀이 1) 배열로 최솟값 구하기 + * 풀이 2) 우선순위 큐로 최솟값 구하기 + * + */ +public class BOJ_13305_주유소 { + + static class Oil implements Comparable{ + int idx, price; + + public Oil(int idx, int price) { + super(); + this.idx = idx; + this.price = price; + } + + @Override + public int compareTo(Oil o) { + if(this.price != o.price) + return this.price > o.price ? 1 : -1; + else + return this.idx < o.idx ? 1 : -1; + } + + } + + static int N; // 도시의 개수 N + static int[] dist; // 누적 도로의 길이 목록 + static int[] price; // 리터 당 가격 목록 + static long sum; // 비용 저장 + static PriorityQueue pq = new PriorityQueue(); + + public static void main(String[] args) throws IOException { + + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + N = Integer.parseInt(br.readLine()); + dist = new int[N]; + price = new int[N]; + + StringTokenizer st = new StringTokenizer(br.readLine()); + dist[0] = 0; // 0에서 0으로 가는 거리 = 0 + for(int i=1; i 도착점 비용 계산 + if(idx==0) return; // 경유지 = 시작점이면 종료 + int minIdx = 0; // 현재 최소 기름값 위치 이전의 최소 기름값 위치 갱신 + //for(int i=0; i sum이 아닌 dp[]를 사용해보자 +7 9 30 V +8 11 40 +9 13 50 + */ +public class BOJ_14501_퇴사 { + + static class Work implements Comparable{ + int start, end, price; // 상담 시작일, 종료일, 금액 + + public Work(int start, int end, int price) { + this.start = start; + this.end = end; + this.price = price; + } + + + @Override + public int compareTo(Work o) { + if(this.end==o.end) + return this.start>o.start?1:-1; + return this.end>o.end?1:-1; + } + } + + 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]; + + PriorityQueue pq = new PriorityQueue<>(); + for(int i=0; i=N) break; // 종료일 기준 정렬 - 초과하면 이후 상담들도 불가능 -> 반복문 종료 + dp[current.end] = Math.max(dp[current.end], current.price); // 현재 상담만 선택한 경우 확인 + for(int i=0; i=N || dy<0 || dy>=N || visited[dx][dy] || Math.abs(A[x][y]-A[dx][dy])R) continue; + // 이동 가능한 도시가 있음 - 인구 이동 가능 확인 + movable = true; + // 이동하려는 지점을 방문처리 + visited[dx][dy] = true; + sum += A[dx][dy]; + cnt++; + dfs(dx,dy); + } + } + +} diff --git "a/parkhayoon/BOJ_1700_\353\251\200\355\213\260\355\203\255\354\212\244\354\274\200\354\244\204\353\247\201.java" "b/parkhayoon/BOJ_1700_\353\251\200\355\213\260\355\203\255\354\212\244\354\274\200\354\244\204\353\247\201.java" new file mode 100644 index 0000000..efbbf92 --- /dev/null +++ "b/parkhayoon/BOJ_1700_\353\251\200\355\213\260\355\203\255\354\212\244\354\274\200\354\244\204\353\247\201.java" @@ -0,0 +1,85 @@ +package algo.week2; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.StringTokenizer; + +/* + * 문제 + * 자기가 사용하고 있는 전기용품의 사용순서를 알아내었고, + * 이를 기반으로 플러그를 빼는 횟수를 최소화하는 방법을 고안 + * + * 입력 + * 첫 줄: 멀티탭 구멍의 개수 N(1≤N≤100), 전기 용품의 총 사용횟수 K(1≤K≤100) + * 둘째 줄: 전기용품의 이름이 K 이하의 자연수로 사용 순서대로 주어짐 + * + * 출력 + * 하나씩 플러그를 빼는 최소의 횟수 + * + * 아이디어 + * 최소 횟수 플러그부터 뽑기? + * 어디서 배운 거 같긴 한데... - 정처기? + * + * 1. 초기상태 + * 끼운 플러그 배열이 비어있으면 입력값 넣기 + * 단, 이미 꼽힌 상태면 지나가기 + * + * 2. 반복 + * 만약 플러그 배열이 꽉 차있음, 새로운 용품이름이 들어옴 - 무조건 뽑아야 함 + * 무엇을 뽑을까? + * + * 예시 + * 2 7 + * 2 3 2 3 1 2 7 - 사용 빈도 수 배열에 저장, 적은 순서대로 뽑기 + */ +public class BOJ_1700_멀티탭스케줄링 { + + 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 K = Integer.parseInt(st.nextToken()); + int[] plugs = new int[N]; + int[] products = new int[K]; + int[] check = new int[K+1]; // 배열이 플러그에 있는지 or기기 사용 횟수 저장 + + st = new StringTokenizer(br.readLine()); + for(int i=0; i 빨리 끝날수록 더 많은 회의 넣을 수 있음 + * + * 오류 발생 후 검색 + * 반례) + * 2 + * 4 4 + * 3 4 + * 2 4 + * 정답: 2, 출력: 1 + * => end뿐만 아니라 start도 정렬! + */ +public class BOJ_1931_회의실배정 { + + static class Time implements Comparable