seaking110 님의 블로그
241224 TIL 본문
- 백준 2579번 계단오르기!
- 입력 : 개수는 1~300 입력 범위는 1~10000
- 출력 : 총 점수의 최댓 값
- 밟는걸 1 건너뛰는걸 0이라고 했을 때 101 또는 011 둘중하나가 되어야하기 때문에
- 101 은 dp[i-2] + arr[i]로 계산이 되고 011은 그전까지의 값 dp[i-3] + arr[i-1]+arr[i] 로 계산이 되므로
- 두 값을 비교하여 큰 값을 dp[i] 값으로 주는 식으로 코딩했다.
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(bf.readLine());
int arr[] = new int[n+1];
for(int i=1;i<=n;i++) {
arr[i] = Integer.parseInt(bf.readLine());
}
int dp[] = new int[n+1];
if(n<2) {
System.out.println(arr[1]);
}
else {
dp[1] = arr[1];
dp[2] = arr[1] + arr[2];
for(int i=3;i<=n;i++) {
dp[i] = Math.max(dp[i-2], dp[i-3]+arr[i-1]) + arr[i];
}
System.out.println(dp[n]);
}
}
}
- 백준 1463번 1로만들기
- 시간 제한 : 0.15초 상당히 짧다 사실 짧으면 dp 말고는 생각이 안난다.
- 입력 : 1부터 10^6 까지 백만이니까 int 형으로 받으면 될 것같다.
- 출력 : 연산의 최솟값
- 그리 쉽진 않았다 for문으로 2부터 입력값까지 증가 시키며 3으로 나뉘면 dp[n/3] +1 한 값을 dp[n]에 2로 나뉘면dp[n/2] +1 한 값과 dp[n] 값과 비교하여 작은 값을 그리고 둘다 안했을 시 dp[n-1] +1 한 값을 dp[n] 에 넣어주며 반복문을 반복했다.
public class Main {
public static int dp[];
public static int t;
public static void main(String[] args) throws IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
t = Integer.parseInt(bf.readLine());
dp = new int[t+1];
if(t==1) {
System.out.println(0);
}
else {
for(int i=2;i<=t;i++) {
dp[i] = Integer.MAX_VALUE;
if(i%3==0) {
dp[i] = dp[i/3] +1;
}
if(i%2==0) {
dp[i] = Math.min(dp[i/2]+1, dp[i]);
}
dp[i] = Math.min(dp[i], dp[i-1]+1);
}
System.out.println(dp[t]);
}
}
}
- 10844번 쉬운 계단 수
- 입력 : 1~100
- 출력 : 값을 10억으로 나눈 나머지 값 -> 값이 10억보다 커진다는 뜻이니 long 사용하자
- 시간 : 1초
- 앞의 값이 0이나 9가 아니라면 만약 3이라면 2에서 오는 값 4에서 오는 값 2가지를 더해주면 되고
- 0이면 1에서 오는 값만 더하고 9면 8에서 오는 값만 더하면 된다
- 마지막에 한번더 10억으로 나눠주는 것을 잊지말자
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(bf.readLine());
long dp[][] = new long[n+1][10];
for(int i=1;i<=9;i++) {
dp[1][i] = 1;
}
for(int i=2;i<=n;i++) {
for(int j=0;j<=9;j++) {
if(j==0) {
dp[i][j] = dp[i-1][1] % 1000000000;
}
else if(j==9) {
dp[i][j] = dp[i-1][8] % 1000000000;
}
else {
dp[i][j] = (dp[i-1][j-1]+dp[i-1][j+1]) % 1000000000;
}
}
}
long sum = 0;
for(int i=0;i<10;i++) {
sum += dp[n][i];
}
System.out.println(sum%1000000000);
}
}
- 백준 2156번 포도주 시식
- 위에서 푼 계단 오르기와 비슷한 문제!
- 입력 : 개수는 1~10000 포도주의 양은 1000이하의 음이 아닌 정수
- 출력 : 마실 수 있는 포도주 양의 최댓값
- 조건 1. 포도주는 다 마셔야한다.
- 조건 2. 3잔 연속 마실 수 없다.
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(bf.readLine());
int arr[] = new int[n+1];
int dp[] = new int[n+1];
for(int i=1;i<=n;i++) {
arr[i] = Integer.parseInt(bf.readLine());
}
dp[1] = arr[1];
int max = arr[1];
if(n>1) {
dp[2] = dp[1] + arr[2];
max = dp[2];
}
for(int i=3;i<=n;i++) {
dp[i] = Math.max(dp[i-1],(Math.max(dp[i-2] , dp[i-3]+arr[i-1])+arr[i]));
if(dp[i] > max) {
max = dp[i];
}
}
System.out.println(max);
}
}
오늘 푼 문제들은 전부 DP 문제로 사실 한번씩 예전에 풀어봤던 문제임에도 점화식을 생각해내는데 꽤나 애를 먹었습니다! 이 문제들은 다시 한번씩 풀땐 점화식을 확실히 생각할 수 있도록 기억해야할 것 같습니다!
- 팀프로젝트 진행
팀원들의 자기소개 페이지를 만드는 프로젝트를 진행하게 되었는데
멤버 카드 부분과 개인페이지 부분을 맡아 오늘은 개인페이지 부분을 만들고 멤버카드와 연동하는 부분까지 진행했습니다!
멤버 카드의 각 id를 받아와 멤버카드를 눌렀을 때 이동하는 코드를 새로 알게되었고 J쿼리는 확실히 자신이 많이 없지만 이번 기회로 많이 배웠습니다!
$(`#${id}`).on('click', function(){
window.location.href = "./"+id+".html";
})'Today I Learned' 카테고리의 다른 글
| 241227 TIL (DFS를 이용한 중복 순열, 순열, 조합구하기) (1) | 2024.12.27 |
|---|---|
| 241226 TIL (0) | 2024.12.26 |
| 241223 TIL (0) | 2024.12.23 |
| 17일차 사전캠프 (1) | 2024.12.20 |
| 16일차 사전캠프 (0) | 2024.12.13 |