PGR21.com
이전 질문 게시판은 새 글 쓰기를 막았습니다. [질문 게시판]을 이용바랍니다.
Date 2008/05/23 18:14:40
Name 루시리스
Subject 머지소트, 바이너리서치, C언어 잘 아시는분 계신가요...
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>

void merge(int h, int m, char parm_a[], char parm_b[], char parm_string[])
{
    // string이 들어있는 배열은 0에서 부터 시작하기때문에 0을 대입  
    int i = 0, j = 0, k = 0;
  
    // 머지소트는 두 배열을 합칠때 크기를 비교해서 합치다가 한 배열이 끝이면 루프탈출
    while(i < h && j < m){
        if(parm_a[i] < parm_b[j]){
            parm_string[k] = parm_a[i];
            i++;
        } else {
            parm_string[k] = parm_b[j];
            j++;
        }
        k++;
    }

    // 다른 한 배열의 끝이 나올때까지 머지 배열에 대입해주어야함
    while(i <  h) parm_string[k++] = parm_a[i++];
    while(j <  m) parm_string[k++] = parm_b[j++];  
}
  
void mergesort(int parm_count, char parm_string[])
{
    if(parm_count > 1){
        int h = parm_count / 2, i;
        int m = parm_count - h;

        char *p_string_a = (char *)malloc(h*sizeof(int));
        char *p_string_b = (char *)malloc(m*sizeof(int));

        if(p_string_a == NULL) exit(EXIT_FAILURE);  // 메모리 할당 실패
        if(p_string_b == NULL) exit(EXIT_FAILURE);  // 메모리 할당 실패

        for(i = 0; i < h; i++) p_string_a[i] = parm_string[i];
        for(i = h; i < parm_count; i++) p_string_b[i - h] = parm_string[i];

        mergesort(h, p_string_a);
        mergesort(m, p_string_b);
        merge(h, m, p_string_a, p_string_b, parm_string);
  
        // 동적으로 할당한 메모리를 반환한다.
        free(p_string_a);
        free(p_string_b);
    }
}

int Binary_Search(int str_length, char str_data[], char *str_key)
{
        int x = 0, data_mid, data_count=str_length-1;
        char str_middata[1];
        
            while(x <= data_count){
                        data_mid = (x + data_count) / 2;
                        str_middata[1] = str_data[data_mid];
                
                        if(strcmp(str_key, str_middata) == -1)
                                data_count = data_mid - 1;
                
                        else if(strcmp(str_key, str_middata) == 1)
                                x = data_mid + 1;
                
                        else
                                return data_mid;
                }

                return -1;

}

  
void main()
{
    int count = 0;
    char input_string[64], *find_string, data_search;

    printf("정렬할 문자열을 입력하세요 : ");
    scanf("%s", input_string);

    // 정렬할 문자열의 길이를 얻는다.
    count = strlen(input_string);
    mergesort(count, input_string);

    printf("\n정렬된 문자열 : %s\n\n", input_string);

    printf("이진 검색을 이용하여 찾을 문자 하나를 입력하세요 : ");
    scanf("%s", &find_string);
    printf("\n");

        data_search=Binary_Search(count, input_string, find_string);

        if(data_search != -1)
                printf("%d번째에 위치한 문자입니다.\n\n", data_search+1);
        
        else
                printf("찾을 수 없습니다.\n");
        

}



입력받은 문자들을 머지소트로 정렬한후 한 문자를 입력하면 바이너리 서치로 그 문자가 위의 정렬된 문자열에서 몇번째

위치에 있는지 찾는 프로그램인데요.. 머지소트는 해결이되었는데 바이너리서치 함수 부분이 해결이안됬네요...

제가 생각하기에는 맞게 짰다고 생각되는데 실행하니까 제대로 실행이안되네요..

어디가 문제인지 알수있을까요?


통합규정 1.3 이용안내 인용

"Pgr은 '명문화된 삭제규정'이 반드시 필요하지 않은 분을 환영합니다.
법 없이도 사는 사람, 남에게 상처를 주지 않으면서 같이 이야기 나눌 수 있는 분이면 좋겠습니다."
08/05/23 19:57
수정 아이콘
떨어지는 수준으로 지적이 가능할까 모르겠지만...;

바이너리 서치는 오름차순 또는 내림차순으로 정렬된 수의 나열에서 찾기 적합한데 문자열에서 특정한 단어를 찾으려면 그 단어들이 enum으로 순서들이 정의되어 있고 내부 문자열에서도 정렬되어 있어야 서치가 가능합니다.

이럴땐 바이너리 서치보단 선형탐색[Linear search]를 추천합니다. 그냥 문자열 처음부터 쭉 읽어가면서 맞는 부분을 찾아가는 알고리즘 이죠.
루시리스
08/05/23 20:29
수정 아이콘
교수님이 바이너리 서치로 꼭 해오라고 하셔서요.. 우선 머지소트로 문자들을 오름차순으로 정렬한후 바이너리 서치로 찾는것인데 도저히 여기서 진행이안되네요..
와후-만세
08/05/23 20:56
수정 아이콘
문자열과 문자에 대해서 개념이 조금 헷갈리신것 같네요. 바이너리 서치 부분만 봣는데
str_middata[1] = str_data[data_mid];
이 줄도 이상하고
char 배열 자체를 [1] 로 잡은것도 이상합니다
Null 문자를 고려해주는 것이 바람직해요.
루시리스
08/05/23 21:05
수정 아이콘
와후-만세님//문자 하나를 지정할때는 char find_string[1] 이런식으로 하는거아닌가요?

그냥 char find_string 하고 scanf로 find_string을 받으면

local variable 'find_string' used without having been initialized 이런 경고가 뜨네요..
08/05/23 21:10
수정 아이콘
char find_string으로 선언하고
scanf에서는 &find_string 이렇게 참조자로 받아야죠.
루시리스
08/05/23 21:23
수정 아이콘
Crom님// 방금 수정해서 실행했는데 제대로 작동이안되네요.. 후우....
목록 삭게로! 맨위로
번호 제목 이름 날짜 조회
37240 드래곤볼 애니 질문좀 할게요~ [6] 언젠가는..2163 08/05/23 2163
37239 머지소트, 바이너리서치, C언어 잘 아시는분 계신가요... [6] 루시리스2553 08/05/23 2553
37238 영화 철권은 뭐 어떻게 되고 있나요? [1] 포셀라나1917 08/05/23 1917
37237 어학연수 관련된 질문입니다. [1] 창천1517 08/05/23 1517
37236 드래곤볼 관련한 질문입니다 ^^ [12] 어...1761 08/05/23 1761
37235 군대 조교는 일병부터 달고 시작하지 않나요? [15] 타나토노트4040 08/05/23 4040
37234 강남역부근 술집 급추천 좀 해주세요 [2] 야메쌍꺼풀2198 08/05/23 2198
37233 여자친구와 해외여행지 좀 추천해주세요~ [13] Polaris_NEO2163 08/05/23 2163
37232 선풍기의 잘못된 사용과 질식사의 관계를 좀 자세히 알고싶습니다. [10] 악학궤범a2155 08/05/23 2155
37231 삼성이 망하면 나라가 망한다?? [18] 김일영2497 08/05/23 2497
37229 오라클 관련 질문입니다 [1] 남자의로망은1841 08/05/23 1841
37228 뮤직비디오관련 질문입니다 Lunatic Love1538 08/05/23 1538
37227 두 단어의 품사에 관한 질문입니다 ~ '0'* [2] 사랑님2078 08/05/23 2078
37226 회사에서 시간 보낼만한거 질문입니다. [15] 낭만한량2215 08/05/23 2215
37225 갑자기 궁금한 질문 [3] 헤르젠1534 08/05/23 1534
37223 외장형 하드 문제입니다. [11] 유키노처럼2129 08/05/23 2129
37222 스타방송을 1~2년동안 안봤습니다. [16] 카시야신1901 08/05/23 1901
37221 KTF BIgi 프리미어리그는 다시보기 없나요?? [1] SouL_ER1870 08/05/23 1870
37220 동영상 음악질문입니다(워3) [2] Brave질럿1912 08/05/23 1912
37219 이런 질문하긴 송구스럽지만 ㅠㅠ;; [4] GoThree2249 08/05/23 2249
37218 건강관련질문입니다 [6] Brave질럿1613 08/05/23 1613
37217 디시 접속이 안됩니다. 도와주세요. [1] Villa Park2071 08/05/23 2071
37216 군입대질문입니다 [6] Brave질럿1876 08/05/23 1876
목록 이전 다음
댓글

+ : 최근 6시간내에 달린 댓글
+ : 최근 12시간내에 달린 댓글
맨 위로