Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- softeer
- es_java_home
- objectstorage
- s3
- db
- 함수 종속성
- bfs
- CODETREE
- 동전 퍼즐
- 인가인증
- 카카오클라우드
- 자바
- BFS
- bitmask
- On-Premise
- DP
- 백엔드 개발
- 코드트리
- MESSAGEBROKER
- 소프티어
- sonarqube
- dockercompose
- jsonwebtoken
- 카카오엔터프라이즈
- java
- 구름
- 완전탐색
- 알고리즘
- DFS
- 정렬
Archives
- Today
- Total
wooing
[Softeer/DP] 징검다리 본문
문제
https://softeer.ai/practice/6293
Softeer - 현대자동차그룹 SW인재확보플랫폼
softeer.ai
해결방법
해당 문제는 DP문제로 점화식을 세우는것이 중요한 문제이다. 내가 생각한 점화식은 다음과 같다.
- 현재 높이보다 낮은 칸들의 최대값 + 1
문제를 풀고 다른 사람들의 풀이법을 보니 나와 조금 달랐다. 다른 사람들은 이 문제를 최장증가부분수열 해결 방법으로, dp[]에 해당 칸을 밟았을때와 안 밟았을때의 max값을 저장하는 방식으로 dp를 구현하였다.
그리고 내 해결방법의 오류나 단점을 생각해보면 다음과 같다.
- 메모리 문제
- 실제로 입력조건에 맞춰 int[100000001]로 배열을 선언하였더니 메모리초과가 발생하여 Map으로 변경하였다.
- 시간복잡도
- 다른 사람들의 풀이는 O(N)이지만, 나의 풀이는 Max값을 찾는 과정에 의해 O(N * 높이 고유 숫자 갯수)가 된다.
소스코드
더보기
import java.io.*;
import java.util.*;
public class Main {
static int N;
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
N = Integer.parseInt(br.readLine());
int[] rocks = new int[N + 1];
Map<Integer, Integer> dp = new HashMap<>();
String[] line = br.readLine().split(" ");
for(int i = 0; i < N; i++){
rocks[i] = Integer.parseInt(line[i]);
dp.put(rocks[i], 0);
}
Set<Integer> keySet = dp.keySet();
for(int i = 0; i < N; i++){
int max = 0;
for(Integer k : keySet){
if(k > rocks[i])
continue;
int v = dp.get(k);
if(v > max)
max = v;
}
dp.replace(rocks[i], max + 1);
}
System.out.println(dp.values().stream().max(Comparator.naturalOrder()).orElse(0));
}
}
'알고리즘' 카테고리의 다른 글
[코드트리/DFS] 뿌요뿌요 (0) | 2025.02.11 |
---|---|
[Softeer/DP, DFS] 효도 여행 (0) | 2025.02.07 |
[Softeer/문자열] GPT식 숫자 비교 (1) | 2025.02.03 |
[Softeer/비트마스크] CPTI (0) | 2025.02.03 |
[코드트리/완전탐색] 금 채굴하기 (1) | 2025.01.21 |