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

alsrb3421님의 프로필 이미지
alsrb3421

작성한 질문수

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

6-H

6-H번 질문있습니다.

작성

·

433

1

언제나 좋은 강의 감사드리고 좋은 답변 감사드립니다.

 

다름이 아니라, 6-H, 2776번을 풀었는데 함수의 입력 인자로 인해 시간 초과가 발생했습니다!

시간 초과가 난 코드는 다음과 같습니다.

http://boj.kr/991bd2528553446498f49861a7098e78

그래서 강의 영상을 보고 난 후, 딱 한 줄에 차이점이 있다는 것을 알았습니다.

 

바로 이분 탐색 함수에 벡터 인자가 vector<int> v가 아니라 vector<itn> &v인 것인데요. &v, 즉 주소로 접근을 하지 않으면 시간 초과가 나는 이유를 알 수 있을까요? 감사합니다!

답변 1

0

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

안녕하세요 3421님 ㅎㅎ

해당 부분은 다음과 같이 되기 때문에 그렇습니다.

참조에 의한 호출로 넘겨야 할 때

복잡한 struct나 많은 요소를 가진 배열을  배열이 차지하는 메모리가 많을 때는 참조로써 매개변수를 넘기는 게 좋습니다. 

간단한 변수, double, int 등은 값에 의한 호출로 넘기는게 좋습니다. 함수내에서 해당 변수를 전부 복사하고 “간접참조” 없이 해당 변수에 대한 로직을 수행하게 되니까요. 

하지만 복잡한 변수의 경우 함수 내에서 전부 복사하고 해당 값을 참조하는 것보다 간접참조를 통해 로직을 수행하는 게 더 빠릅니다.  

성능에 의한 시간초과 예

예를 들어 다음은 문제 : 암기왕의 풀이코드 2개입니다. 

https://www.acmicpc.net/problem/2776

암기왕의 경우 배열에 100만개의 요소를 담아야 합니다.

해당 코드들은 &말고는 다른 점이 없습니다. 다만 제출을 했을 때 2번코드는 시간초과가 나지 않고 1번 코드는 시간초과가 나기도 합니다. 

 

제출 했을 때 시간초과가 난다면 이러한 부분도 고려해보는게 좋습니다.

// 1번 : 시간초과
int check(vector<int> v, int chk)
{
int lo = 0; int hi = v.size() - 1;
while(lo <= hi)

     …(생략)

}
// 2번 : 통과
int check(vector<int> &v, int chk)
{
int lo = 0; int hi = v.size() - 1;
while(lo <= hi)

     …(생략)

}

 

다만,  로직 자체가 배열을 복사하는 로직이라면 굳이 참조에 의한 호출을 하는 것과 값에 의한 호출을 하는 것의 차이는 사라집니다. 

ex)

void copy_v(vector<int>& a) {
auto copy = a;
}

 
또한, 해당 부분은 교안에 업데이트를 시킬 예정입니다.

사실 이 부분은 성능에 차이가 있다라는 것은 알고 있었지만, 문제 제출시에 이정도의 시간초과 사례는 3421님이 처음이신 것같습니다. 3421님 덕분에 교안이 더 좋아진 것같아 감사의 말씀을 드립니다.

 

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

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

감사합니다.

강사 큰돌 올림.

 

alsrb3421님의 프로필 이미지
alsrb3421

작성한 질문수

질문하기