Notice
Recent Posts
Recent Comments
Link
«   2026/09   »
일 월 화 수 목 금 토
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
Tags more
Archives
Today
Total
관리 메뉴

seaking110 님의 블로그

241224 TIL 본문

Today I Learned

241224 TIL

seaking110 2024. 12. 24. 20:06
  • 백준 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