본문 바로가기
백준(Java)/23년 5월

[Java] 백준 - 2579번: 계단 오르기

by C0MPAS 2023. 5. 18.

5월 18일(목) - 동적 계획법 1 (2579번)

 

2579번: 계단 오르기

계단 오르기 게임은 계단 아래 시작점부터 계단 꼭대기에 위치한 도착점까지 가는 게임이다. <그림 1>과 같이 각각의 계단에는 일정한 점수가 쓰여 있는데 계단을 밟으면 그 계단에 쓰여 있는 점

www.acmicpc.net

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

 

문제점

// 수정 전
	dp[0] = 0;
        dp[1] = stairs[1];
        dp[2] = stairs[1] + stairs[2];
        for(int i=3; i<=N; i++)
        {
            dp[i] = stairs[i] + Math.max(dp[i-2], stairs[i-1] + dp[i-3]);
        }
        
        
// 수정 후
        dp[0] = 0;
        dp[1] = stairs[1];
        if(N >= 2)
        {
            dp[2] = stairs[1] + stairs[2];
        }
        for(int i=3; i<=N; i++)
        {
            dp[i] = stairs[i] + Math.max(dp[i-2], stairs[i-1] + dp[i-3]);
        }

1. 위와같이 제출했더니 런타임 에러(ArrayindexOutOfBounds) 가 발생

풀이 - 1)

-> 배열 stairs와 dp의 크기를 N+1로 설정했던 것을 301로 수정

 

풀이 - 2)

-> 분기점을 계단의 수가 3개 이상인 경우부터 for문을 돌리던 것에서 2개 이상인 경우로 변경

-> 계단의 수가 2개 이상인 경우부터 if문을 추가하여 dp[2]값을 계산해주면서 해결

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

 

풀이 - 1

(C언어 풀이 활용)

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        int N = Integer.parseInt(br.readLine());
        int[] stairs = new int[301];
        int[] dp = new int[301];

        for(int i=1; i<=N; i++)
        {
            stairs[i] = Integer.parseInt(br.readLine());
        }

        dp[0] = 0;
        dp[1] = stairs[1];
        dp[2] = stairs[1] + stairs[2];
        for(int i=3; i<=N; i++)
        {
            dp[i] = stairs[i] + Math.max(dp[i-2], stairs[i-1] + dp[i-3]);
        }

        System.out.println(dp[N]);
    }
}

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

 

풀이 - 2

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        int N = Integer.parseInt(br.readLine());
        int[] stairs = new int[N+1];
        int[] dp = new int[N+1];

        for(int i=1; i<=N; i++)
        {
            stairs[i] = Integer.parseInt(br.readLine());
        }

        dp[0] = 0;
        dp[1] = stairs[1];
        if(N >= 2)
        {
            dp[2] = stairs[1] + stairs[2];
        }
        for(int i=3; i<=N; i++)
        {
            dp[i] = stairs[i] + Math.max(dp[i-2], stairs[i-1] + dp[i-3]);
        }

        System.out.println(dp[N]);
    }
}

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

댓글