합친 LIS (난이도: 하)

2022. 9. 29. 23:11·알고리즘 (with JAVA)/동적 계획법

( 여기서 설명하는 알고리즘은 아래의 사이트에서 LIS를 먼저 선행 후 풀는 것을 추천합니다. )

최대 증가 부분 수열(난이도: 하) (tistory.com)

 

최대 증가 부분 수열(난이도: 하)

1. 문제 설명 (1) 부분 순열에 포함된 숫자들이 순 증가(strictly increasing)하면 이 부분 수열을 증가 부분 수열이라고 부른다. * 순 증가란, 두 인접한 숫자 중 앞의 것이 항상 더 작을 때 수열이 순증

kind-coding.tistory.com

 

 

 

1. 문제 설명

(1) 두 개의 정수 수열 A와 B에서 각각 길이 0 이상의 증가 부분 수열을 얻은 뒤 이들을 크기 순서대로

합친 것을 합친 증가 부분 수열이라고 부른다.

* JLIS(Joined Longest Increasing Subsequence)라고 부르며, LIS를 합친 것으로 보면 된다. 

 

(2) 이때, 두 입력으로 주어진 정수 수열 A와 B가 있을 때, 각각의 LIS를 구한 후 합친 LIS 즉, JLIS를

찾는 프로그램을 작성하시오.

* 예를 들어, '1 2 4' 와 '3 4 7' 이 있다면 '1 2 3 4 7'이 되므로 값은 5가 된다.

 

 

 

 

2. 입출력 조건 및 예제

입력 조건

(1) 입력의 첫 줄에는 테스트 케이스의 수 C(1<=C<=50)

(2) 그 후 두 번째 줄에 A와 B의 길이 N(1<=N)과 M(M<=100)

(3) 그 후 세 번째 줄에 N개의 정수로 A의 원소들

(4) 그 후 네 번째 줄에 M개의 정수로 B의 원소들

 

출력 조건

(1) 각 테이스 케이스의 JLIS 값을 출력

 

입력 예제

3
3 3
1 2 4
3 4 7
3 3
1 2 3
4 5 6
5 3
10 20 30 1 2
10 20 30

 

출력 예제

5

6

5

 

 

 

 

3. 제약 조건

(1) 프로그램은 2초 안에 실행되어야 하며, 64MB 이하의 메모리를 사용해야 합니다.

 

 

 

 

4. 가정법

X

 

 

 

 

5. 기저 사례

X

 

 

 

 

6. 코드

public class JLIS {
    private static BufferedReader sc = new BufferedReader(new InputStreamReader(System.in));
    private static StringBuilder sb = new StringBuilder();

    private static int N,M;
    private static int[] A, B;

    private static int[][] cache;

    public static void main(String[] args) throws IOException {
        StringTokenizer st;
        int C = Integer.parseInt(sc.readLine());

        for(int i=0; i<C; i++) {
            cache = new int[101][101];

            st = new StringTokenizer(sc.readLine());
            N = Integer.parseInt(st.nextToken());
            A = new int[N];
            M =  Integer.parseInt(st.nextToken());
            B = new int[M];

            st = new StringTokenizer(sc.readLine());
            for(int j=0; j<N; j++) {
                A[j] = Integer.parseInt(st.nextToken());
            }

            st = new StringTokenizer(sc.readLine());
            for(int j=0; j<M; j++) {
                B[j] = Integer.parseInt(st.nextToken());
            }
            sb.append(solve(-1, -1)+"\n");
        }
        System.out.println(sb);
    }

    private static int solve(int indexA, int indexB) {
        // 캐시 확인
        if(cache[indexA+1][indexB+1] != 0) {
            System.out.println("cache hit!! "+(indexA+1)+":"+(indexB+1)+"="+cache[indexA+1][indexB+1]);
            return cache[indexA+1][indexB+1];
        }

        // 어떤 원소이든 재귀호출을 무조건 1번 이상
        // 수행하므로 ret값은 0으로 초기화 한다.
        int ret=0;

        // -1을 처음부터 넣어서 모두 비교를 할 수 있게 한다.
        // 그러기 위해서는 아래와 같은 초기값을 위한 long max가 필요하다.
        long a = (indexA==-1 ? -999:A[indexA]);
        long b = (indexB==-1 ? -999:B[indexB]);
        long max = Math.max(a, b);

        // 어떤 수열이 먼저와도 상관없다.
        // 여기서는 A수열 비교
        for(int nextA=indexA+1; nextA<N; nextA++) {
            if(max<A[nextA]) cache[indexA+1][indexB+1] = ret = Math.max(ret, solve(nextA, indexB)+1);
        }

        // 어떤 수열이 먼저와도 상관없다.
        // 여기서는 B수열 비교
        for(int nextB=indexB+1; nextB<M; nextB++) {
            if(max<B[nextB]) cache[indexA+1][indexB+1] = ret = Math.max(ret, solve(indexA, nextB)+1);
        }
        return ret;
    }
}

 

 

 

 

7. 점화식

* 이때 NEXT(indexA)와 NEXT(indexB)는 증가 부분 수열의 다음 위치에 올 수 있는 A와 B 원소의 인덱스

저작자표시

'알고리즘 (with JAVA) > 동적 계획법' 카테고리의 다른 글

양자화 (난이도: 중)  (0) 2022.10.03
원주율 외우기 (난이도: 하)  (0) 2022.10.01
최대 증가 부분 수열(난이도: 하)  (2) 2022.09.29
삼각형 위의 최대 경로 (난이도: 하)  (0) 2022.09.28
와일드 카드 (난이도: 중)  (0) 2022.09.27
'알고리즘 (with JAVA)/동적 계획법' 카테고리의 다른 글
  • 양자화 (난이도: 중)
  • 원주율 외우기 (난이도: 하)
  • 최대 증가 부분 수열(난이도: 하)
  • 삼각형 위의 최대 경로 (난이도: 하)
백_곰
백_곰
  • 백_곰
    친절한 코딩
    백_곰
  • 전체
    오늘
    어제
    • 분류 전체보기
      • 알고리즘 (with JAVA)
        • 기본 알고리즘
        • 완전 탐색
        • 분할 정복 알고리즘
        • 동적 계획법
        • 탐욕법
        • 코딩 테스트 기출 문제
        • 코드트리 조별과제
      • 백준 (with JAVA)
        • 완전 탐색
        • 분할 정복
        • 그 외
      • 자바
        • 개발 환경 구축하기
        • 팁
        • 기본적인 개념
        • 컬렉션 프레임워크
        • 프로세스와 쓰레드
        • 지네릭스
        • 람다식
        • 스트림
        • 입출력 IO
        • 네트워킹
        • 열거형(enums)
        • java.lang 패키지
        • java.time 패키지
        • 유용한 클래스들
        • 형식화 클래스들
      • 안드로이드 with 자바
        • 응용 문제들
        • 자잘한 문제들
        • 오류 보고서
  • 블로그 메뉴

    • 링크

    • 공지사항

    • 인기 글

    • 태그

      outputstream
      Collections Framework
      안드로이드 스튜디오
      중간연산
      serializable
      문자 기반 스트림
      자바 개념
      제자리 정렬
      안정 정렬
      알고스팟
      코딩트리조별과제
      ServerSocket
      유용한 클래스
      다형성
      코딩테스트
      선택 정렬
      java.lang패키지
      역직렬화
      람다식
      map()
      소켓 프로그래밍
      snail
      스트림
      불안정 정렬
      InputStream
      Arrays
      file
      TCP 소켓 프로그래밍
      java.time 패키지
      코드트리
    • 최근 댓글

    • 최근 글

    • hELLO· Designed By정상우.v4.10.3
    백_곰
    합친 LIS (난이도: 하)
    상단으로

    티스토리툴바