Social Developer
Home
  • 분류 전체보기 (121)
    • Life (3)
    • Idea note (0)
    • Algorithms (84)
    • CS (16)
      • Data Structure (7)
      • Network (9)
    • Skill (13)
      • Spring (0)
      • Java (9)
      • Infra (3)
      • Etc. (1)
Home
  • 분류 전체보기 (121)
    • Life (3)
    • Idea note (0)
    • Algorithms (84)
    • CS (16)
      • Data Structure (7)
      • Network (9)
    • Skill (13)
      • Spring (0)
      • Java (9)
      • Infra (3)
      • Etc. (1)
블로그 내 검색

Social Developer

어제보다 한 걸음 더

  • Algorithms

    [백준 알고리즘](DP) 2579번 Java 풀이

    2020. 4. 22.

    by. SDev

    728x90

    DP - 1463, 11726, 11727, 9095, 10844, 11057, 2193, 9465, 2156, 11053, 11055, 11722, 11054, 1912, 2579, 1699, 2133, 9461, 2225, 2011, 1105

    출처: https://plzrun.tistory.com/entry/알고리즘-문제풀이PS-시작하기 [plzrun's algorithm]

     

    알고리즘 문제풀이(PS) 시작하기

    이런건 고수들이나 써야 하지 않나 싶지만, 그래도 1년정도 공부하면서 이 분야를 어떻게 시작해야 할지 써보려 한다. 라고 운을 뗀다음 열심히 내 얘기만 했던 후속편이다. 내 인생사가 궁금하신 분들은 이 글의..

    plzrun.tistory.com

     

    백준 알고리즘 2579번

     

     

    요즘 한동안 DP문제에 손을 못대고, 최근 파이썬을 공부하게 되면서 오랜만에 풀다보니 감이 많이 떨어졌다. 문제 접근까지는 비슷하게 갔는데, 마지막 계단을 반드시 밟는다는 조건을 못 풀고 있었다. 다른 분의 풀이를 참고해보니 역순으로 접근하면 되는 것... 이전에도 유사한 문제가 있었는데 내가 아예 까먹은 것 같다..ㅠㅠ

    처음에는 시작하는 위치에서 증가하는 방향으로 행동을 Select, Not 2개로 정의한 뒤, 경우의 수를 쭉 나열해보고 Not select를 하는 순간부터 연속 select 조건이 사라지므로 SSN, SN, N으로 세 가지로 추려냈다. 그리고 조건 중 마지막 계단을 반드시 밟는 다는 조건에서 헤매다가 결국 다른 분의 풀이를 참고했다.
    https://limkydev.tistory.com/121

     

    <정답 풀이>

    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
    31
    32
    33
    34
    package dp;
     
    import java.util.Scanner;
     
    public class N2579 {
     
        public static void main(String[] args) {
     
            Scanner sc = new Scanner(System.in);
            int n = sc.nextInt();
            int arr[] = new int[n+1];
            int dp[] = new int[n+1];
            
            
            for(int i=1;i<=n;i++) {
                arr[i] = sc.nextInt();
            }
            
            dp[1] = arr[1];
            if(n>=2) {
                dp[2] = arr[1]+arr[2];
            }
            
            for(int i=3;i<=n;i++) {
                dp[i] = Math.max(dp[i-2]+arr[i], dp[i-3]+arr[i-1]+arr[i]);
            }
            
            System.out.print(dp[n]);
            
            
        }
     
    }
     
    Colored by Color Scripter
     

     

    내 첫 접근방식과 가장 크게 다른 부분은 기준점을 마지막 계단으로 잡고, 그 이전 계단들의 액션을 케이스로 나눠 접근한다는 점이다. 이런 식으로 접근하면 마지막 계단을 반드시 밟는다는 조건을 쉽게 만족시킬 수 있다. 

    마지막 계단(n번째)을 밟는다면,
    1) n-1번째 계단을 밟지 않고 n번 계단만 밟는 경우,
    2) n-1번도 밟고, n번 계단만 밟는 경우
    두 가지 경우의 수가 있다.

    1)의 경우 n-2번은 반드시 밟았을 것이므로 dp[n] = dp[n-2] + arr[n]이라는 점화식을 세울 수 있고,
    2)의 경우 n-2번을 반드시 밟지 않고, n-3번 계단을 반드시 밟았을 것이므로 dp[n] = dp[n-3] + arr[n-1] +arr[n]이라는 점화식을 세울 수 있다.

    점화식을 코드에 옮기는 건 아주 간단한 일인데, 이 과정에서 한 가지 이슈가 있었다.
    arr과 dp 배열을 크기 n으로 생성하면 문제가 발생한다. (arr[0]부터 값을 받아 마지막 계단이 arr[n-1]인 경우)

    만약 그렇게 코드를 짜게되면 24-25라인에서 for문은 index 2부터 돌아주는 걸로 수정을 해줘야 하는데(3번째 값이 index 2에 들어가니까)이 경우 dp[i-3]이 out of bounds 이슈가 생긴다. dp[-1]이란게 없으니 당연한 결과...

    따라서 이 풀이는 index 1부터 n까지 받는 형식으로 arr과 dp 배열을 만들고 써줘야 한다.
    (이게 더 편하기도 하고!)

     

     

     

     

    Github: https://github.com/jaeuk9407/AlgorithmBOJ

     

    jaeuk9407/AlgorithmBOJ

    BaekJoon Online Judge Problems. Contribute to jaeuk9407/AlgorithmBOJ development by creating an account on GitHub.

    github.com

     

    저작자표시 (새창열림)

    'Algorithms' 카테고리의 다른 글

    [백준 알고리즘] 10972번 Python 풀이  (0) 2021.01.08
    [백준 알고리즘] 1167번 Python 풀이  (0) 2021.01.01
    [백준 알고리즘] (DP&DC) 1912번 Java 풀이  (0) 2020.04.03
    [백준 알고리즘] (DP) 11054번 Java 풀이  (0) 2020.03.30
    [백준 알고리즘] (DP) 11722번 Java 풀이  (0) 2020.03.30

    댓글

    관련글

    • [백준 알고리즘] 10972번 Python 풀이 2021.01.08
    • [백준 알고리즘] 1167번 Python 풀이 2021.01.01
    • [백준 알고리즘] (DP&DC) 1912번 Java 풀이 2020.04.03
    • [백준 알고리즘] (DP) 11054번 Java 풀이 2020.03.30
    맨 위로
전체 글 보기
  • 인정님 블로그
  • 성현님 블로그
Tistory 로그인
Tistory 로그아웃
로그아웃 글쓰기 관리

Today

Total

Powered by ⓒ Kakao Corp.

Designed by Nana
블로그 이미지
SDev

티스토리툴바