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

한유태님의 프로필 이미지
한유태

작성한 질문수

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

6-F

6-F 질문드립니다 :)

해결된 질문

작성

·

38

·

수정됨

0

안녕하세요 선생님 🙂

 

한군데 이해가 가지 않는 부분이 있어서 질문드립니다.

 

아래의 코드는 Check함수에서 init_attack 변수를 설정하여 attack으로 초기화하도 않았을 뿐더러 아예 사용을 하지 않았습니다. 결론부터 말씀드리면 틀렸는데요, 이게 왜 틀린건지 이해가 되지 않습니다. 혹시 call by value인가요?

 

입력 값에서 용사의 공격력을 이미 입력받았고, 그 공격력을 포션방을 갔을 때 입력받은 용사의 공격력을 증가시키면 된다고 생각했는데요, 이게 왜 안되는걸까요?

http://boj.kr/9ca6118540e54a259b26c070a1b20868

답변 1

1

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

안녕하세요 ㅎㅎ

ll N, ATK, t[123460], a[123460], h[123460];
ll player_hp;
ll low, high, mid;

bool Check(ll m)
{
	ll temp = m;
	ll init_atk = ATK;
	ll cnt = 0;
	for (int i = 0; i < N; i++)
	{
		if (t[i] == 1)
		{
			cnt = h[i] / ATK + (h[i] % ATK ? 1 : 0) - 1;
			m -= cnt * a[i];
		}
		else if (t[i] == 2)
		{
			ATK += a[i];

전역변수로 설정한 ATK이 매번 Check함수 실행할 때마다 -> += 되는 꼴입니다.

임시변수인 init_atk 을 활용하지 않아서 생긴 문제인 것 같습니다.

 

혹시 call by value인가요?

-> 지역변수로 선언하고 함수에 넘기고 함수에서 할당하지 않는 이상 해당 지역변수가 바뀌지 않습니다. 그러나 전역변수로 선언했기 때문에 함수에서 값을 변경하면 -> 해당 전역변수는 값이 바뀌게 됩니다.

 

감사합니다.

 

감사합니다.

한유태님의 프로필 이미지
한유태
질문자

아..!! check함수를 통해서 용사의 체력을 결정해주는 것인데, 임시변수를 사용해서 초기 ATK로 시작하는 것이 아닌 ATK 자체를 누적시켜버리면 문제가 발생하겠군요..!! 선생님 덕분에 깨달았습니다 ㅎㅎ 감사합니다!!

한유태님의 프로필 이미지
한유태

작성한 질문수

질문하기