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

yeon _leaf님의 프로필 이미지
yeon _leaf

작성한 질문수

10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트

8-B

8-B 질문입니다.

해결된 질문

작성

·

264

0

for (int i=0; i<n; i++) {
	if (st >= STR[i] || in >= INT[i]) {
		ret++; /*★*/
		if (!v[i]) {
			v[i] = 1;
			pb.push_back(i);
			pnt += PNT[i];
		}
	}
}

안녕하세요 선생님.

정답 코드에서 왜 무조건 st >= STR[i] || in >= INT[i] 조건에 해당하면 ret++을 하는지 궁금합니다.

for (int i=0; i<n; i++) {
	if (st >= STR[i] || in >= INT[i]) {
		if (!v[i]) {
			ret++;
			v[i] = 1;
			pb.push_back(i);
			pnt += PNT[i];
		}
	}
}

저는 !visited && (st>=STR[i] || in>=INT[i]) 인 경우에만 ret을 증가시켜 주었는데요. 이미 visited된 경우는 제외해야 할 것이라고 생각해서 저렇게 코드를 작성했습니다.

답변 2

1

큰돌님의 프로필 이미지
큰돌
지식공유자

안녕하세요 yeon님ㅎㅎ

문제를 잠깐 볼까요?

i번째 퀘스트를 깨려면 캐릭터의 힘이 STR[i]보다 크거나 같거나, 지력이 INT[i]보다 크거나 같아야 한다. 이 퀘스트를 깨면, 스탯을 올릴 수 있는 포인트를 PNT[i]개 만큼 얻게 된다.

자, 여기서 이 코드는 무슨 코드냐면. 어느정도 퀘스트를 깨고 얻은 포인트로 str, int에 적절히 분배를 했고 그걸 기반으로 str, int에서의 최대의 퀘스트를 찾는 함수에요.

int rpg(int STR, int INT){
	int &ret = dp[STR][INT];

이미 어느정도의 퀘스트를 깨서 얻은 str, int기 때문에 만약 해당 퀘스트에 visited, 즉 해당 퀘스트를 깼다면 해당 부분에 대한 visited = 1 처리는 할 필요는 없지만, ret = 0부터 카운팅을 시작하기 때문에 ++을 해주어야 하는 셈이죠.

	ret = 0;
	int pnt = 0;
	vector<int> Q;
	for(int i = 0; i < n; i++){
        if(a[i].x <= STR || a[i].y <= INT){
            ret++;

p.s 8주차를 하고 계시다니 반갑네요. ㅎㅎ 열심히 하시니 너무나 좋습니다. 꼭 열심히 하셔서 좋은 성과가 있기를 바랄게요.

 

감사합니다.

0

yeon _leaf님의 프로필 이미지
yeon _leaf
질문자

ret이 0부터 시작하기 때문에 카운팅은 무조건 해야 하는 것이군요.. 이해했습니다. 답변 감사합니다!!

(+) 8주차 문제가 어려워 좌절하고 있었는데 응원해 주시니 힘이 나는 것 같습니다. 열심히 하겠습니다:)

yeon _leaf님의 프로필 이미지
yeon _leaf

작성한 질문수

질문하기