본문 바로가기

알고리즘/다이나믹프로그래밍

[자바]백준 2491번 수열 [다이나믹프로그래밍][엄탱]

728x90

안녕하세요. 개발자 엄탱입니다.
이 글은 알고리즘을 공부하면서 공부 기록용입니다.
그래서 설명마다 일기용으로 편하게 작성하여 반말 형식으로 작성하려고 합니다.
그리고 보시다가 더 좋은 방법이나 잘 못 알고 있는 내용이 있다면 알려주시면 정말 감사하겠습니다.
좋은 하루 되세요 :)

 

https://www.acmicpc.net/problem/2491

 

2491번: 수열

0에서부터 9까지의 숫자로 이루어진 N개의 숫자가 나열된 수열이 있다. 그 수열 안에서 연속해서 커지거나(같은 것 포함), 혹은 연속해서 작아지는(같은 것 포함) 수열 중 가장 길이가 긴 것을 찾

www.acmicpc.net

문제 사진

문제 설명

문제는 잘 읽어보면 알아서 이해가 되니 위에 문제를 천천히 읽어보기를 추천하겠다.

해설

위에 문제는 연속해서 커지거나 연속해서 작아지는 수열중 길이가 긴 것을 찾아 내는 문제이기 때문에 두번의 확인이 필요하다.

  1. 처음 수 부터 시작하여 마지막 수 까지 탐색하여 오름차순 길이를 파악하여 긴 길이를 찾기
  2. 처음 수 부터 시작하여 마지막 수 까지 탐색하여 내림차순 길이를 파악하여 긴 길이를 찾기

코드

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        
        int N = Integer.parseInt(br.readLine());
        StringTokenizer st = new StringTokenizer(br.readLine());
        
        int[] arr = new int[N];
        
        for (int i = 0; i < N; i++) {
            arr[i] = Integer.parseInt(st.nextToken());
        }
        
        int maxCount = 1;
        int count = 1;
        for (int i = 1; i < N; i++) {
            if (arr[i - 1] <= arr[i]) {
                count++;
                maxCount = Math.max(maxCount, count);
            } else {
                count = 1;
            }
        }
        
        count = 1;
        for (int i = 1; i < N; i++) {
            if (arr[i - 1] >= arr[i]) {
                count++;
                maxCount = Math.max(maxCount, count);
            } else {
                count = 1;
            }
        }
        
        System.out.println(maxCount);
        br.close();
    }
}
728x90