강의

멘토링

커뮤니티

인프런 커뮤니티 질문&답변

HB님의 프로필 이미지
HB

작성한 질문수

코딩테스트 실전 모의고사(with C++) : 대기업 대비

5. 효율적인 공부(동적계획법)

1-5 효율적인 공부 dy를 시간(N)으로 하는 풀이 질문

작성

·

311

0

안녕하세요. 결론부터 말하자면 1-5문제 오답인데요

선생님께서 푸신 풀이와는 좀 다른 방식으로 풀었습니다.

저는 구간이 아니라 쌩으로 전체 시간 (N)을 dy로 놓고 풀었습니다. = (time_)

=> dy는 해당 시간까지의 최대효율값을 넣고있습니다.

 

[1] 일들을 끝나는 시간으로 정렬해서 그 순서대로 진행하는건 동일하구요.

[2] dy 배열에서 해당 일의 시작 시간 - R (쉬는시간) 부터

0번째 시간까지 한 일 중에 가장 큰 값에다 해당 일의 효율을 더하는 식으로 진행했습니다.

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int time_[1000001]; //dy***

struct my{
	int a,b,c;
	my(int a, int b, int c){
		this->a=a; //시작 시간
		this->b=b; //끝나는 시간
		this->c=c; //효율
	}
	
	bool operator<(const my& other)const{
		return b<other.b;
	}
	
};

int main() {
	int max_=0;
	int N,M,R; //총 시간, 일 개수, 휴식시간 
	vector<my> arr;
	
        ...
	
	//DP
	sort(arr.begin(), arr.end());
	for(int i=0; i< arr.size(); i++){ //일의 갯수 
		int val;
		if(arr[i].a - R >=1){
			//time의 1번째부터  arr[i].a - R번째까지 수 중에... 
			//가장 큰 값을 찾아서 더하여 넣음
			int maxtmp=0;
			for(int j=0; j<=arr[i].a-R; j++){
				if(maxtmp < time_[j]) maxtmp = time_[j];
			}
			val = maxtmp + arr[i].c;
			
		}
		else{
			val = arr[i].c;
		}
		
                //할 수 있는 일이 없으므로                   
		//다음 일정이 끝나기 전 까지 같은 값 넣기 
		int j = arr[i].b;
		time_[j]=val;
		
		while( i+1!=arr.size() && j<arr[i+1].b){
			time_[j]=val;			
			j++;			
		}
		//최대값 찾기
		if(val > max_) max_ = val;
	}
	
	cout<<max_;

	return 0;
}

 

이렇게 풀다가 오답이 나왔습니다. 결과는 케이스 1만 오답이고 나머지 2345는 정답인데

  • 정답은 83인데 제 코드는 81이 나옵니다

큰 입력에 대해서는 정답인게 케이스 1에 뭔가 반례가 있어서 틀린 것 같은데 모르겠습니다...

이전 단계 강의에서 늘상 하던 방식으로 걸리는 시간을 배열로 놓은거라 방법 자체는 맞는 것 같은데 이유를 모르겠습니다. 도와주세요

 

 

답변 1

0

김태원님의 프로필 이미지
김태원
지식공유자

안녕하세요^^

1번 입력데이터입니다. 스스로 디버그해보세요.

90 20 4

55 80 5

74 84 16

42 57 19

40 64 8

48 57 5

43 58 17

62 81 10

1 59 16

17 38 18

80 83 19

83 86 20

32 33 13

13 25 8

27 79 9

12 43 16

64 70 3

75 89 12

62 75 18

34 55 14

3 26 13

HB님의 프로필 이미지
HB

작성한 질문수

질문하기