14501. 퇴사 (실버3) https://www.acmicpc.net/problem/14501
DP
나도 하고싶다 퇴사! 풀기 전 문제 유형 중에 브루트포스 보고 대충 빡구현 하기로 결심함
며칠을 혼자 반복문에 별 조건 다 써가면서 풀다가 이건 글렀다 싶어 구글링했다. 결국 DP가 답이었다. 나처럼 빡구현 시도한 사람은 없으려나
import java.io.*;
import java.util.*;
public class Main {
static int n;
static int[] tarr;
static int[] parr;
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
n=Integer.parseInt(br.readLine());
tarr = new int[n]; // 상담 기간
parr = new int[n]; // 금액
for(int i=0; i<n; i++) {
st = new StringTokenizer(br.readLine());
tarr[i] = Integer.parseInt(st.nextToken());
parr[i] = Integer.parseInt(st.nextToken());
}
int[] dp = new int[n+1];
for(int i=0; i<n; i++) {
if(i+tarr[i] <=n ) {
dp[i+tarr[i]] = Math.max(dp[i+tarr[i]], dp[i]+parr[i]);
}
dp[i+1] = Math.max(dp[i+1], dp[i]);
}
System.out.println(dp[n]);
}
}
아무래도 DP 공부좀 하고 다시 봐야할 듯.. TODO
참고한 블로그1) https://yeons4every.tistory.com/62
13458. 시험 감독 (브론즈2) https://www.acmicpc.net/problem/13458
수학
엄청 간단한 계산 문제인데 왜 자꾸 '틀렸습니다' 나오나 봤더니 int 형이 아니라 long 이였다. 에라이
첫째 줄에 시험장의 개수 N(1 ≤ N ≤ 1,000,000)이 주어진다.
둘째 줄에는 각 시험장에 있는 응시자의 수 Ai (1 ≤ Ai ≤ 1,000,000)가 주어진다.
셋째 줄에는 B와 C가 주어진다. (1 ≤ B, C ≤ 1,000,000)
import java.io.*;
import java.util.*;
public class Main {
static long n; //시험장 수
static float[] a; //응시자 수
static float b, c; // 총감독관이 한 시험장에서 감시할 수 있는 응시자 수, 부감독관이 감시할 수 있는 응시자 수
static long result=0;
public static void main(String[] args) throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
n = Integer.parseInt(br.readLine());
a = new float[(int) n];
StringTokenizer st = new StringTokenizer(br.readLine());
for(int i=0; i<n; i++) a[i] = Float.parseFloat(st.nextToken());
st = new StringTokenizer(br.readLine());
b = Integer.parseInt(st.nextToken());
c = Integer.parseInt(st.nextToken());
result = n; // 총감독관
for(int i=0; i<n; i++) {
a[i] -= b; // 총감독관 감시 응시자수 제외
if(a[i]>0) result += Math.ceil((float)(a[i]/c));
}
System.out.println(result);
br.close();
}
}
14888. 연산자 끼워넣기 (실버1) https://www.acmicpc.net/problem/14888
백트랙킹, DFS
완전탐색을 하고싶은데.. 딱히 방법이 안떠올라서 순열을 쓰나 뭘 하나 고민했다. DFS를 활용한 백트랙킹이라 한다. 못하는거 투성이
import java.io.*;
import java.util.*;
public class Main {
static int n;
static int[] a;
static int[] ops = new int[4];
static long min=Integer.MAX_VALUE, max=Integer.MIN_VALUE;
public static void main(String[] args) throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
n = Integer.parseInt(br.readLine());
a = new int[n];
StringTokenizer st = new StringTokenizer(br.readLine());
for(int i=0; i<n; i++) a[i]=Integer.parseInt(st.nextToken());
st = new StringTokenizer(br.readLine());
for(int i=0; i<4; i++) ops[i]=Integer.parseInt(st.nextToken());
backTracking(a[0], 1);
bw.write(max+"\n"+min);
bw.flush();
bw.close();
br.close();
}
static void backTracking(int num, int idx) { // 현재 계산중인 숫자, 인덱스(숫자 배열 a)
if(idx==n) {
min = Math.min(min, num);
max = Math.max(max, num);
}
for(int i=0; i<4; i++) {
if(ops[i]>0) {
ops[i]--; // 연산자 사용
switch(i) {
case 0: backTracking(num+a[idx], idx+1); break;
case 1: backTracking(num-a[idx], idx+1); break;
case 2: backTracking(num*a[idx], idx+1); break;
case 3: backTracking(num/a[idx], idx+1); break;
}
ops[i]++; // 재귀 호출 후 개수 원복
}
}
}
}
[1일1커밋 10D] 유형별(3) DP 동적프로그래밍 | 백준 JAVA (0) | 2024.10.06 |
---|---|
[1일1커밋 9D] 유형별 풀이(2) 이진탐색 대충 끝 | 백준 JAVA 1654, 2805, 2110 (1) | 2024.10.01 |
[1일1커밋 8D] 아자아자 | 유형별 풀이(2) 이진탐색 ing | 백준 JAVA 1920, 10816 (0) | 2024.09.29 |
[1일1커밋 7D] 연휴 끝! 다시 시작하는 1일1커밋 챌린지 | SWEA S/W 문제해결 기본 4일차 (3) | 2024.09.23 |
[1일1커밋 6D] 재귀 푸는 중.. | 백준 JAVA 27433, 10870, 25501 (1) | 2024.09.08 |
댓글 영역