C/C++ 에서, 배열을 비교하는 함수가 있나요?
글쓴이: pogusm / 작성시간: 목, 2011/04/28 - 4:10오후
int a[10] = {1,2,3,4,5,6,7,8,9,10};
int b[20] = {6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25};
일때, 위 두개를 비교해서, "5개가 일치합니다" 라는 결과 얻고 싶은데..
for(int i=0; i<10; i++) { for(int j=0; j<20; j++) { 비교문 } }
이런 방법말고 보다 세련되고 빠르고 편한 함수같은게 혹시 있나요?
(Qt에서 연습중입니다)
Forums:
음... 궁리를 해 봤지만
제 수준에선 제시한 방법 이상 깔끔한 방법을 찾기 어려울듯 한데요...
다른 아름다운 방법이 있을까요 ?
고민이 많아 고민인 애늙은이 입니다.
...
C++이라면, set에다가 배열 하나를 다 집어넣은 다음 두번째 배열로 loop를 돌면서 있는지 체크하면 훨씬 빠르게 할 수 있을 것 같습니다.
(물론 C에서도 set 같은 걸 짜면 되긴 하지만 귀차니즘의 압박이...)
sorting이 되어 있다는 가정하에서는 비교횟수를
sorting이 되어 있다는 가정하에서는 비교횟수를 줄일 수 있을 것 같긴한데.
sorting을 해야되면 별 이득이 없어보이네요.
데이터가 많으면 결국 sort하는게 유리할겁니다..
데이터가 많으면 결국 sort하는게 유리할겁니다..
set 도 일종의 sort라고 볼 수 있고요..
미리 sort된 데이터에 대해서는 여러가지 방법들을 적용해 볼 수 있을거고요..
sort를 할거라면, 두 배열을 합쳐서 sort한 다음에,
연속된 두 숫자가 같은지를 체크하는 것도 깔끔은 해보이겠네요.. (efficient한지는.. )
이 경우 1개의 어레이에 중복된 데이터가 이미 있는
이 경우 1개의 어레이에 중복된 데이터가 이미 있는 경우,
어떻게 처리할 것인지에 대해서 미리 정의해야겠네요..
원글에서 이런 고민이 없는 걸 보면,
이미 두개의 배열 자체를 set type으로 만드는게 맞을듯도 싶고요..
sorting되고 중복된 값이 없다면
for(i=0, j=0, cnt=0; i<10 && j<20;)
{ if (a[i]==b[j]) { cnt++; i++; j++; } else if (a[i] <b[j]) i++; else j++;
}
printf(”%d개가 일치합니다\n”, cnt);
답변 감사합니다
그냥 간단한 함수 같은건 없나보네요.
ㅠㅠ
C++ 의 set 이라는건 제가 잘 몰라서... 함 찾아봐야겠네요 ㅋ
http://www.google.com/search?
http://www.google.com/search?hl=ko&q=c%2B%2B+array+compare&sourceid=ie7&rls=com.microsoft:ko:IE-Address&ie=&oe=&rlz=1I7GGLL_ko
재벌 2세가 재벌이 될 확률과
금메달리스트 2세가 금메달을 딸 확률이 비슷해지도록
자유오픈소스 대안화폐를 씁시다.
아이디의 아이디어 무한도전
http://blog.aaidee.com
귀태닷컴
http://www.gwitae.com
python 이라면
set이라는게 보여서 논외(!)적으로......
python 이라면
a = [1,2,3,4,5,6,7,8,9,10]
b = [6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25]
print len(set(a) & set(b))
정도 되겠네요.
ps. 여러언어 버전으로 나올까...두렵군요-.-;
두려울꺼 있나요. ruby a =
두려울꺼 있나요.
ruby
대강 복잡도 분석하면
소팅 하면 보통 소팅은 O(NlogN) 이고 비교는 O(N)이니 그냥 O(NlogN) 정도면 충분히 비교 가능합니다. 2중루프면 O(N^2)정도 되고요. 배열이 많이 커진다면 정렬 뒤 비교하는게 나을 것 같네요.
...
배열이 정말 크다면 hash table을 이용하면 expected O(N)으로 때려잡을 수 있습니다. (물론 worst case는 훨씬 안좋아지겠죠.)
댓글 달기