일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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
- php 프로그래밍 입문 예제
- 자바 스프링
- Flutter
- 파이썬
- JAVA SPRING
- php 프로그래밍 입문 문제풀이
- 최단 경로
- 페이코 추천인
- 페이코 초대코드
- 페이코 추천인코드
- C
- 스프링
- 백준
- php 프로그래밍
- php 프로그래밍 입문 3판
- 배열
- 페이코 친구코드
- php 프로그래밍 입문 솔루션
- C언어
- spring
- php 프로그래밍 입문
- php 프로그래밍 입문 연습문제
- 플러터
- 자바
- 플러터 개발환경 설정
- programmers
- SWEA
- php
- 한정 분기
Archives
- Today
- Total
11-07 11:40
ImJay
[BOJ/Java] 11722. 가장 긴 감소하는 부분 수열 본문
반응형
[BOJ/Java] 11722. 가장 긴 감소하는 부분 수열
문제 해석
이 문제는 주어진 배열에서 가장 긴 감소하는 부분 수열의 길이를 찾는 문제이다. 감소하는 부분 수열이란, 수열의 원소들이 감소하는 순서로 정렬된 수열을 의미한다.
풀이 과정
제출된 코드는 동적 프로그래밍(DP)을 이용한 방식으로 구현되어 있지만, 로직에 오류가 있어 정확히 문제의 요구사항을 충족하지 못하는 부분이 있다. 주어진 코드는 각 원소를 순회하면서, 해당 원소가 위치할 수 있는 dp 배열의 위치를 찾아 갱신하는 로직을 사용한다. 하지만, 이 로직은 감소하는 수열을 찾기보다는 어떤 형태로든 수열을 구성하려 하므로 문제의 의도와 맞지 않는다.
문제를 풀기 위해 정상적으로 감소하는 부분 수열을 확인하려면, dp 배열을 이용하여 각 위치에서 끝나는 가장 긴 감소하는 부분 수열의 길이를 저장해야 한다. 각 원소에 대해 이전의 원소들과 비교하여, 현재 원소가 더 작을 경우 dp 값을 갱신하는 방식으로 로직을 구성해야 한다.
코드
package edu.ssafy.im.BOJ.Silver.S2.No11722;
import java.io.*;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Main {
private static int N, ans = 0; // N: 수열의 크기, ans: 최장 감소 부분 수열의 길이
private static int[] A, dp; // A: 입력받은 수열, dp: 각 위치에서 끝나는 가장 긴 감소 부분 수열의 길이를 저장
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringBuilder sb = new StringBuilder();
N = Integer.parseInt(br.readLine()); // 수열의 크기 입력
A = new int[N]; // 수열 저장 배열
StringTokenizer st = new StringTokenizer(br.readLine()); // 수열 입력 처리
for (int i = 0; i < N; i++) {
A[i] = Integer.parseInt(st.nextToken()); // 수열의 각 원소 저장
}
dp = new int[N]; // DP 배열 초기화
for (int a : A) { // 각 원소에 대해
for (int i = 0; i < N; i++) {
if (dp[i] <= a) { // 현재 원소가 dp 배열 내 저장된 원소보다 크거나 같으면 갱신 (로직 오류 부분)
dp[i] = a;
break;
}
}
}
for (int d : dp) { // DP 배열을 순회하며 값이 0이 아닌 원소의 수 계산
if (d != 0) ans++;
else break;
}
sb.append(ans); // 결과 출력
bw.write(sb.toString());
bw.flush();
bw.close();
}
}
시간 복잡도 분석
이 코드의 시간 복잡도는 O(N^2)이다. 이는 각 원소에 대해 최악의 경우 모든 dp 배열 원소를 검사할 수 있기 때문이다.
느낀점
코드의 오류를 통해 동적 프로그래밍의 정확한 이해와 적용의 중요성을 다시 한번 깨달았다. 문제의 요구사항을 정확히 이해하고, 알고리즘을 설계할 때 논리적 오류가 없도록 주의해야 함을 느낀다.
반응형
'알고리즘 > BOJ - Java' 카테고리의 다른 글
[BOJ/Java] 2579. 계단 오르기 (0) | 2024.04.23 |
---|---|
[BOJ/Java] 4485. 녹색 옷 입은 애가 젤다지? (0) | 2024.04.23 |
[BOJ/Java] 1520. 내리막 길 (0) | 2024.04.23 |
[BOJ/Java] 19942. 다이어트 (0) | 2024.04.23 |
[BOJ/Java] 20055. 컨베이어 벨트 위의 로봇 (0) | 2024.04.23 |
Comments