#문제

수열 A가 주어졌을 때, 가장 긴 증가하는 부분 수열을 구하는 프로그램을 작성하시오.

예를 들어, 수열 A = {10, 20, 10, 30, 20, 50} 인 경우에 가장 긴 증가하는 부분 수열은 A = {10, 20, 10, 30, 20, 50} 이고, 길이는 4이다.

입력

첫째 줄에 수열 A의 크기 N (1 ≤ N ≤ 1,000)이 주어진다.

둘째 줄에는 수열 A를 이루고 있는 Ai가 주어진다. (1 ≤ Ai ≤ 1,000)

출력

첫째 줄에 수열 A의 가장 긴 증가하는 부분 수열의 길이를 출력한다.

 

#작성 코드

#include <iostream>
using namespace std;

int N;
int A[1001];	// N최대값 1000이므로. 인덱스 1~1000 사용

// 수열 A의 i번째 수까지 증가하는 부분 수열의 원소 개수
int d[1001]; 

int solve(){
	int result=0;
	
	for(int i=1; i<=N; i++){
		// i번째 수 이전의 수들 중에서 A[i]보다 작은 수에 대해 조사. 
		for(int j=1; j<i; j++){
			if( A[i] > A[j] ){
				// i번째 수까지의 증가 수열의 길이
				// = i이전에 A[i]보다 작은 수까지의 증가 수열의 길이 + 1 (i를포함시킨다.) 
				d[i] = max( d[i], d[j]+1 );
			}
		}
		// d[i]를 갱신하면서, result에 가장 큰 d[i]를 갱신한다. 
		result = max(result, d[i]);
	}
	return result;	// 가장 긴 증가수열의 길이를 리턴. 
}

int main(){
	// 수열의 원소 개수 입력. 
	cin>>N;
	// N개의 원소 입력. 
	for(int i=1; i<=N; i++){
		cin>>A[i];
	}	
    // d[1001] 전역배열의 원소를 모두 1로 초기화한다.
	fill_n(d, 1001, 1);
    
	cout<<solve()<<"\n";
	return 0;
} 

##

전역배열을 모두 1로 초기화하려고  int d[1001] = {1, }; 코드를 사용하였는데, 이것때문에 틀렸음을 알았다

위의 코드는 배열의 첫 번째 원소만 1로 초기화하고 나머지는 모두 0으로 초기화되기 때문에 원하는 결과를 얻을 수 없었다.

https://shjz.tistory.com/38 에서 배열을 초기화 하는 방법을 찾았다.

int d[1001]; 으로 전역 배열을 선언하고,

std::fill_n(d, 1001, 1); 으로 main 함수 내에서 초기화하는 방법을 사용해야겠다.

'BOJ' 카테고리의 다른 글

BOJ 1753번 :: 최단경로  (0) 2019.12.05
BOJ 1012번 :: 유기농 배추  (0) 2019.12.05
BOJ 2156번 :: 포도주 시식  (0) 2019.12.04
BOJ 2667번 :: 단지번호붙이기  (0) 2019.12.04
BOJ 10844번 :: 쉬운 계단수  (0) 2019.12.03

+ Recent posts