inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

3-E

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

340

kei jay

작성한 질문수 13

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';
}

c++ 코딩-테스트

답변 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점은 제가 큰 힘이 됩니다. :)

감사합니다.

강사 큰돌 올림.

0

kei jay

감사합니다

교안 158페이지 문의드립니다

0

11

2

코딩살구클럽 관련 건의사항

0

29

1

코살에 19942 다이어트 문제에 N의 범위가 빠져있슴니다

0

13

1

진행 방법 질문드립니다!

0

48

2

2-I) 왜 이 문제가 그래프이론 카테고리에 있는지 잘 모르겠습니다.

0

56

2

2주차 개념#12 트리 순회

0

26

2

백준사이트가 종료된다고 합니다.

0

286

2

백준 서비스 종료

9

890

1

sk 하이닉스 코테 대비

0

368

2

3-G 최댓값 질문

0

51

1

모듈러 연산 값이 10이 아닌 경우도 있지 않나요?

0

83

2

3-I 코드 질문드립니다.

0

62

2

3-N 질문 있습니다.

0

66

2

학습방법

0

102

2

4-H 질문 있습니다 (코드 리뷰)

0

66

2

코딩테스트 어디까지 준비해야 하는지 질문이 있습니다.

0

170

2

2-O 반례가 무엇일지 어떤 부분이 틀렸는지 잘 모르겠습니다.

0

69

2

2주차 개념 #4-2. 인접행렬 질문있습니다.

0

64

2

1-A 문제풀이 후 궁금한 점이 생겨서 질문드립니다.

0

51

2

조합 재귀 풀이 확인 해주시면 감사하겠습니다.

0

68

2

함수별 시간복잡도

0

73

2

3-h 질문입니다.

0

49

1

안녕하세요 선생님. 시간 복잡도 4번 질문있습니다.

0

53

2

1-I 문제 질문 드립니다.

0

76

2