[백준 BOJ] 2491번 수열 (Java)

2022. 9. 19. 14:30PS (Program Solving)/BOJ (백준)

문제 설명

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

 

2491번: 수열

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

www.acmicpc.net

백준 BOJ 2491번 수열 문제 사진1
백준 BOJ 2491번 수열 문제 사진2

 

접근 방법 - 배열을 이용한 연산 문제

백준의 2491번 문제는 배열에 대한 연산을 이용하여 해결해야 하는 문제이다.

해당 문제는, 입력받은 수열에 대해 오름차순 또는 내림차순에 있어 가장 긴 것을 찾아 그 길이를 출력해야 하는 문제이다.

사실 이 문제는 dp(다이나믹 프로그래밍)의 원리로 해결해야 하는 문제이다.

따라서, 그와 관련한 풀이를 원했다면 바로 뒤로 가기를 눌러주기를 바란다. (어쩌면 이게 dp 풀이가 맞으려나)

필자의 경우엔 현재와 이전의 배열값을 비교해가며 up과 down 변수의 값에 변동을 주었고 이를 이용하여 최댓값 연산을 수행해보아 문제를 해결하였다.

혹여나 해당 문제를 해결하는 데에 어려움을 겪고 있다면, 아래의 설명과 코드를 참고해보길 바란다.

필자는 아래의 순서대로 코드를 작성하여 문제를 해결하였다.

 

코드의 실행 순서

1) 수열의 길이(n)를 입력받는다.

n을 입력받는 즉시, n의 크기를 갖는 배열 arr를 선언한다.

 

2) 최댓값을 저장할 변수 max를 1로 초기화하여 선언한다.

또한, 오름차순의 길이를 임시로 저장할 변수 up과 내림차순의 길이를 임시로 저장할 변수 down을 모두 1로 초기화하여 선언한다.

 

3) n의 크기만큼 반복문을 실행하여 아래의 연산을 취한다.

- arr의 배열값을 하나씩 입력받는다. 

(이때, 현재 배열 인덱스가 0이라면 다음 인덱스의 배열값을 입력받은 뒤 아래의 연산을 취한다.)

- 현재 입력받은 배열값이 이전 배열값보다 크다면, 이는 오름차순이다.

만일 이전까지 내림차순의 길이를 측정하다가 해당 오름차순을 만났다면, 현재 down의 값을 max와 비교해본다.

만일 max보다 현재 down의 값이 더 크다면, max의 값을 현재 down의 값으로 변경한다.

그리고, 위 조건문들의 통과 여부와 상관없이 up의 값을 1 증가하고 현재 down의 값을 1로 변경한다.

- 현재 입력받은 배열값이 이전 배열값보다 작다면, 이는 내림차순이다.

만일 이전까지 오름차순의 길이를 측정하다가 해당 내림차순을 만났다면, 현재 up의 값을 max와 비교해본다.

만일 max보다 현재 up의 값이 더 크다면, max의 값을 현재 up의 값으로 변경한다.

그리고, 위 조건문들의 통과 여부와 상관없이 down의 값을 1 증가하고 현재 up의 값을 1로 변경한다.

 

4) 3)에서 모든 연산이 끝났다면, max의 값에 대해 최종적으로 확인해본다.

현재 up과 down 중 max보다 큰 값이 있다면, 해당 값으로 max의 값을 변경한다.

 

5) 최종적으로 저장된 max의 값을 출력한 뒤, 실행 종료한다.

반응형

 

성공한 코드

import java.util.Scanner;

//백준 2491번 코드
public class Main {
	public static void main(String args[]) {
		Scanner s=new Scanner(System.in);
		int n=s.nextInt();
		int arr[]=new int [n];
		
		int max=1;
		int up=1;	int down=1;
		for(int i=0;i<n;i++) {
			arr[i]=s.nextInt();
			if(i!=0) {
				if(arr[i-1]<arr[i]) {
					if(down>up&&down>max) {
						max=down;
					}
					up++;	down=1;
				}
				else if(arr[i-1]>arr[i]) {
					if(up>down&&up>max) {
						max=up;
					}
					down++;	up=1;
				}
				else {
					up++;	down++;
				}
			}
		}
		
		if(max<up) {max=up;}
		if(max<down) {max=down;}
		System.out.println(max);
	}
}

 

제출 결과

백준 BOJ 2491번 수열 문제 Java 제출 결과

(2022.07.17 백준 2491번 문제 제출 결과)

반응형