징검다리

문제 링크 : https://softeer.ai/practice/6293

접근 방식

소프티어의 특정 문제같은 경우, 문제가 뜻하는바가 무엇인지 이해가 잘 안되는 경우가 있었다.

이 문제가 나에게 그러해서, 이해를 못했었다.

문제는 이러했다.
왼쪽부터 오른쪽까지 일정 높이를 가진 돌이 주어진다.
나는 무조건 이전에 올랐던 돌보다 높았던 돌만 오를 수 있다.
이 경우에, 내가 오른 돌의 최대 개수를 구해야 한다.
1 2 3 2 1 과 같이 주어진다면
1 => 1 2 3 (3개)
2 => 2 3 (2개)
3 => 3 (1개) 2 => 2 (1개) 1 => 1 (1개)
와 같이 오를 수 있다. 나는 총 세 개의 돌을 오를 수 있는 것이다.

따라서 특정 계단에서 오를 수 있는 계단의 최대 숫자가 결과 값이 된다.

이는 DP와도 연관됨을 알 수 있다.
내가 현재 위치가 3이라고 했을 때, 2까지의 횟수와 3까지의 횟수를 비교해서 큰 수가 3까지왔을 떄의 최대 개수가 된다.

결과

소스 코드

import java.io.*;
import java.util.*;

public class Main {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int N = sc.nextInt();
        int arr[] = new int[N];
        for(int i=0; i<N; i++) arr[i] = sc.nextInt();
        int answer = 0;
        int dp[] = new int[N];
        for(int i=0; i<N; i++){
            dp[i] = 1;
            for(int j=0; j<i; j++){
                if(arr[j]<arr[i]){
                    dp[i] = Math.max(dp[i], dp[j]+1);
                }
            }
            answer = Math.max(dp[i], answer);
        }
        System.out.println(answer);
    }
}

현재 돌 위치에 서면 오른 것으로 판단하고 1을 부여한다.

이후에 현재 위치 전까지 완전 탐색을 통해, 오를 수 있는 수를 비교하고 현재의 개수와 이전개수와 비교하여 최대 값을 갱신한다.

여기서 이전 개수에 +1을 하는 이유는, 계단을 올랐기 때문에 오른 계단을 표시해주는 것이다.

알게 된 점

없음.