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

kei jay님의 프로필 이미지
kei jay

작성한 질문수

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

3-E

3-E 뮤탈리스크 질문있습니다.

작성

·

292

0

- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요!
- 먼저 유사한 질문이 있었는지 검색해보세요.
- 서로 예의를 지키며 존중하는 문화를 만들어가요.
- 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.

 

안녕하세요 강사님

강의 잘듣고 있습니다.

 

3-E 뮤탈리스크 문제 관련해서 질문이 있는데요.

풀이강의 듣기전에는 저런식으로 재귀함수를 생각했는데요.

데미지를 계산하는 함수를 만들고 그 안에 데미지 9,3,1에 대해서 순열을 계산해서 나온 6개에 대한 재귀함수를 각각 작성해서 끊임없이 내부에서 돌다가, SCV 3개의 피가 모두 0이하가 되면 return 해서 빠져나오는걸 생각했습니다.

뭐 보시다싶이...모든 케이스 다 틀리게 나오고 cnt도 1000이상씩 증가하는거보면 완전히 로직도 이상한것 같습니다만

디버깅 돌려봐도 워낙 복잡해서 그런지... 어디서 잘못된거지 정확히 이해가 안가서요.

혹시 로직이 어떤게 잘못된거지 봐주실수 있나요?

아니면 아예 접근법 자체가 완전히 틀려서 안되는건지 궁금합니다.....

#include <iostream>
#include <vector>
#include <algorithm>
#include <queue>
#include <climits>

using namespace std;

int cnt = 0;
int ret = INT_MAX;
int n,aa,bb,cc;

void attack(int a, int b, int c)
{
	cnt++;
	if (a <= 0 && b <= 0 && c <= 0)
	{
		ret = ret < cnt ? ret : cnt;
		//cout << "cnt : " << cnt << "   a : " << a << "   b : " << b << "    c : " << c<<endl;
		cnt--;
		return;
	}
	attack(a - 9, b - 3, c - 1);
	attack(a - 9, b - 1, c - 3);
	attack(a - 3, b - 9, c - 1);
	attack(a - 3, b - 1, c - 9);
	attack(a - 1, b - 3, c - 9);
	attack(a - 1, b - 9, c - 3);
}

int main()
{
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);
	cin >> n >> aa >> bb >> cc;
	attack(aa, bb, cc);
	cout << ret << '\n';
}

답변 1

0

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

안녕하세요 kei님 ㅎㅎ

그 경우에는 전역변수로 cnt를 넘겨주면 안됩니다.

매개변수로 넘겨주어서.

해당 attack의 cnt로 만들어주는게 중요해요.

이 문제는

공격 >> cnt + 1이잖아요. 근데 그 공격이 6개의 경우의 수가 있기 때문에

공격 >> cnt + 1을 하는 경우의 수가 6개가 있는 것이니 해당 경우의 수 당 cnt + 1하는 것 & 그 상태값을 넘기는 코드가 필요한 것입니다.

#include <iostream>
#include <vector>
#include <algorithm>
#include <queue>
#include <climits>

using namespace std;

int cnt = 0;
int ret = INT_MAX;
int n,aa,bb,cc;

void attack(int a, int b, int c, int cnt)
{ 
	if (a <= 0 && b <= 0 && c <= 0)
	{
		ret = ret < cnt ? ret : cnt;  
		return;
	}
	attack(a - 9, b - 3, c - 1, cnt + 1);
	attack(a - 9, b - 1, c - 3, cnt + 1);
	attack(a - 3, b - 9, c - 1, cnt + 1);
	attack(a - 3, b - 1, c - 9, cnt + 1);
	attack(a - 1, b - 3, c - 9, cnt + 1);
	attack(a - 1, b - 9, c - 3, cnt + 1);
}

int main()
{
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);
	cin >> n >> aa >> bb >> cc;
	attack(aa, bb, cc, 0);
	cout << ret << '\n';
}

앞의 코드처럼 구축하시면 됩니다.

다만 앞의 코드는 테케는 통과하나 시간초과가 나는 코드에요.

(이 문제는 BFS로 구축해야 합니다. 해당 부분은 강의에서 설명드리고 있습니다.)

 

또 질문 있으시면 언제든지 질문 부탁드립니다.

좋은 수강평과 별점 5점은 제가 큰 힘이 됩니다. :)

감사합니다.

강사 큰돌 올림.

kei jay님의 프로필 이미지
kei jay
질문자

감사합니다

kei jay님의 프로필 이미지
kei jay

작성한 질문수

질문하기