Notice
Recent Posts
Recent Comments
Link
04-27 12:54
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- Java
- spring
- 우리FIS아카데미
- 맥OS
- 우리FISA
- https
- 클라우드 서비스 개발 #
- Gradle
- M2
- K-디지털트레이닝
- 로드밸런스
- 우리에프아이에스 #
- 맥
- route 53
- 우리FIS아카데미 #
- 리눅스
- AWS
- mysql
- 도메인
- jdk
- 글로벌소프트웨어캠퍼스
- 우리에프아이에스
- 우리FISA #
- sts
- dbeaver
- 맥북
- 클라우드 서비스 개발
- springboot
- HTTP
Archives
- Today
- Total
<<개발일지>>
[인프런/다이나믹(LIS)/최대 부분 증가수열] 본문
<<풀이>>
우선 이 문제는 LIS(최장 증가 부분 수열) 이라는 알고리즘을 가진 문제이다.
dynamic programming(동적계획법)
중 하나로 처음 푼다면 생각하기가 조금 어려운 듯 하다 ㅋㅋ ㅎㅎ 내가 그럼 ..
이 문제의 접근 방식은 아래 사진과 같다.
처음 값을 arr에 넣고 같은 크기의 배열 dy도 추가해준다.
dy를 추가해주는 이유는 비교를 통해 최장 길이를 구하기 위함이다.
for문으로 arr처음 돌면서 그 밑으로 작은 값이 있다면 +1을 해주고 dy에 넣는 형식이다.
이러한 논리를 가지고 접근하면 수월하게 풀 수가 있다!!
import java.util.*;
class Main {
static int[] dy;
private int solution(int[] arr) {
int answer = 0;
dy = new int[arr.length];
dy[0] = 1;
for(int i=1; i<arr.length; i++) {
int max = 0;
for(int j=i-1; j>=0; j--) {
if(arr[j] < arr[i] && dy[j] > max) max = dy[j];
}
dy[i] = max + 1;
answer = Math.max(answer, dy[i]);
}
return answer;
}
public static void main(String[] args) {
Main T = new Main();
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int[] arr = new int[n];
for(int i=0; i<n; i++) {
arr[i] = in.nextInt();
}
System.out.print(T.solution(arr));
}
}
풀이를 보면 이중 for문이지만 하나는 ++일때이고 내부는 --이다. 이러한 생각이 어려운 것은 아니지만 떠오르는 것 역시 익숙하지 않으면 힘들다. 꾸준히 공부해서 이러한 것도 유연하게 다룰 수 있게 해보자 !!
'코딩테스트' 카테고리의 다른 글
[인프런/LIS/가장 높은 탑 쌓기] (1) | 2024.09.08 |
---|---|
[인프런/DFS/섬나라 아일랜드] (5) | 2024.09.01 |
[인프런/BFS/12.토마토] (1) | 2024.05.19 |
[인프런/greedy/결혼식] (0) | 2024.04.17 |
[백준/1018/구현/체스판 다시 칠하기] (1) | 2024.04.11 |