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

SUBNY·2023년 8월 8일
0

백준

목록 보기
12/22
post-thumbnail

백준문제캡처

(https://www.acmicpc.net/problem/2579)





접근 방법 🧐

같은 주간에 풀었던 포도주 시식 문제와 다른 점은, 마지막 도착 계단을 꼭 밟아야한다는 조건이 있다.
포도주 시식 문제 풀이

과거 KB에서 배웠전 구간합 문제가 생각이 났다.

세가지 조건으로 나눴다.
1. 계단이 1개일 때 → 그 1계단이 최대
2. 계단이 2개일 때 → 1계단 + 2계단이 최대
3. 계단이 3계단 이상일 때 → 위 그림처럼 경우가 나뉘어질 수 있다.
   - 검은 색이 밟는 계단이라고 했을 때, 두가지로 나뉘어진다.
   - n-1번째를 밟느냐 안밟느냐로 나뉘어진다.
   - n = 3일 경우도 생각해서 n=3인 것까지 값을 초기화 시켜주고 i=4부터 반복문을 실행 시켰다.


  • score[3] = 연속 3계단 밟을 수 없으니, 1번째 또는 2번째 중 최대 + 마지막인 3번째 계단

  • score[i-3] + wine[i-1] = n-3, n-1 번째 계단 밟았을 때

  • score[i-2] = n-3, n-2번째 계단 밟았을 때

→ 3가지 경우 모두 마지막에 step[i]를 더해서 마지막 계단을 밟아줘야한다.



내가 쓴 코드 ✍️

import java.io.*;

public class Main {

	public static void main(String[] args) throws IOException{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		
		int N = Integer.parseInt(br.readLine());
		int[] step = new int[N+1];
		int[] score = new int[N+1];
		
		for(int i=1;i<=N;i++) {
			step[i] = Integer.parseInt(br.readLine());
		}
		if(N == 1) {
			score[1] = step[1];
		}
		else if(N == 2) {
			score[2] = step[1]+step[2];
		}
		else {
			score[1] = step[1];
			score[2] = step[1]+step[2];
			score[3] = Math.max(step[1], step[2])+step[3];
					
			for(int i=4;i<=N;i++) {
				score[i] = Math.max(score[i-3]+step[i-1], score[i-2])+step[i];
			}
		}

		bw.write(score[N]+"");
		bw.flush();
		bw.close();
	}
}

느낀점 📖

마지막 계단을 꼭 밟아주다 보니, 포도주 시식 문제와는 다르게 생각할 경우가 그림으로는 좀 적었다! 하지만 1계단일 경우, 2계단일 경우를 생각하지 못하고 if문으로 나눠주지 않았더니 런타임 에러가 나왔다.
그리고 계단이 두개만 있을 경우에는 2번째 계단을 밟는 것이 최대다! 라는 말도 안되게 초기화를 해둬서..🙃 틀렸당

profile
대체할 수 없는 풀스택 개발자가 되고 싶어요

0개의 댓글