코딩문제
[소프티어] 징검다리
do_hyuk
2025. 1. 24. 19:04
https://softeer.ai/practice/6293
Softeer - 현대자동차그룹 SW인재확보플랫폼
softeer.ai
다음 문제는 처음에 이중 반복문으로 쉽게 풀 수 있다고 생각했지만 현재 밟고있는 돌을 기준으로 다음 돌을 건너뛸 수 있기에 복잡하다 생각하였다.
일단 문제의 제약조건을 보면 N이 최대 3 x 10^3 이기 때문에 시간복잡도 O(n^2) 이 가능하다는 것을 알았다.
알고리즘으로는 어떤 것을 사용해야 할지 고민하다가 현재 밟고있는 돌과 다음 돌을 밟았을 때의 카운트 크기를 비교하기 위해 dp를 사용하기로 했다.
전체 코드
import java.io.*;
import java.util.*;
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[] arr = new int[N];
int[] dp = new int[N];
Arrays.fill(dp, 1);
StringTokenizer st = new StringTokenizer(br.readLine());
for (int n = 0; n < N; n++) {
arr[n] = Integer.parseInt(st.nextToken());
}
for (int i = 0; i < N; i++) {
for (int j = 0; j < i; j++) {
if (arr[j] < arr[i]) { //다음 돌이 현재 돌보다 높을 때
//현재 돌을 밟았을 때와, 이전 돌을 밝고 현재 돌을 밟았을 때의 최댓값 비교
dp[i] = Math.max(dp[i], dp[j] + 1);
}
}
}
int result = 0;
for (int i = 0; i < N; i++) {
result = Math.max(dp[i], result);
}
System.out.println(result);
}
}