ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 4-1 애너그램 판별 프로그램
    Computer Science/Boostcourse CS50 2021. 12. 24. 02:43
    728x90

    애너그램이란 문자의 구성은 같고, 배치 또는 뜻만 다른 문자열을 의미합니다.

    버블 정렬 알고리즘을 이용하여 5개의 숫자로 구성된 문자열 애너그램을 판별하는 프로그램을 작성해보았습니다.

     

    #include <stdio.h>
    #include <string.h>
    #define SIZE 5 
     
    int check_anagram(char anagram[][6]);
    
    int main() {
        // 문자열의 끝인 null값까지 포함하여 6열까지 공간을 할당해줘야함. 
    	char anagram[2][6] = {"11132", "21131"}; 
    	if(check_anagram(anagram)) 
    		printf("Anagram True\n");
    	else 
    		printf("Anagram False\n");
    }

     

    정렬 후 문자열이 같은지 비교하기 위하여 strcmp 함수를 사용해야 하므로 string.h를 포함시켜주었고,

    정렬 알고리즘 반복문의 조건에 사용되는 기호 상수 SIZE를 정의해 주었습니다.

    문자열을 정렬했을 때 문자 구성이 같은지 판별해 주는 애너그램 판별 함수 check_anagram 함수를 선언해 주었습니다. 참이면 1, 거짓이면 0을 반환해 줄 것입니다.

    문자열의 길이를 5바이트로 제한을 두는 2행 6열 2차원 배열을 선언해 주었으며, 여기서 [2][6]인 이유는 문자열 리터럴의 끝을 알려주는 '\0'(=NULL) 값이 오기 때문에 5바이트에서 1바이트를 추가로 할당해 주었습니다.

    2차원 배열을 check_anagram 함수에 인자로 전달하여 두 문자열이 애너그램이라면 True를,

    애너그램이 아니라면 False를 출력하게 될 것입니다.

     

    int check_anagram(char anagram[][6]) { // 각 문자의 아스키코드 값을 버블정렬로 오름차순 정렬 
    	int i, j;
    	char temp; 
    	
    	printf("정렬 전: %s\t%s\n",anagram[0], anagram[1]);
    	
    	for(i = 0; i<SIZE; i++) {
    		for(j = 0; j< SIZE-i-1; j++) {
    			if(anagram[0][j]>anagram[0][j+1]) {
    				temp = anagram[0][j];
    				anagram[0][j] = anagram[0][j+1];
    				anagram[0][j+1] = temp;
    			}
    			
    			if(anagram[1][j]>anagram[1][j+1]) {
    				temp = anagram[1][j];
    				anagram[1][j] = anagram[1][j+1];
    				anagram[1][j+1] = temp;
    			}
    		}
    	}
    	
    	printf("정렬 후: %s\t%s\n",anagram[0], anagram[1]);
    	
    	if(strcmp(anagram[0], anagram[1]) == 0) 
    		return 1;
    	else

     

    정수형 배열 두 개를 선언하여 정렬 후 마지막에 반복문으로 애너그램인지 판별할 수도 있었겠지만,

    저의 경우 char형으로 5개의 숫자를 한 쌍으로 묶어서 각각의 문자에 대응되는 아스키코드 값을 비교시켜서

    마지막 반복문을 사용하지 않고 strcmp 함수로 판별하였습니다.

    버블 정렬두 개의 인접한 원소끼리 비교하여 오름차순일 경우 더 작은 원소를 앞으로 보내는 정렬 알고리즘으로,

    이 과정을 반복하면 마지막에는 가장 큰 값이 맨 뒤로 이동하게 되고 맨 앞에서부터 작은 원소를 시작으로 나열됩니다. 버블 정렬의 시간 복잡도는 상한일 때 O(n^2)이며, 하한일 때(이미 정렬되어 있는 경우) O(n^2)을 가집니다.

    정렬이 끝난 후에는 anagram[0]과 anagram[1]의 문자 구성이 똑같은지 비교해서 애너그램이라면 1을,

    아니라면 0을 반환합니다.

    출력 결과는 다음과 같습니다.

     

    정렬 알고리즘에는 버블 정렬 이외에 삽입, 선택, 퀵, 병합 정렬 등 다양한 알고리즘이 있지만

    무난하고 구현하기 쉬운 버블 정렬을 이용해보았습니다.

    다음에는 알고리즘 연습도 해볼 겸 여러 방법으로 구현해보겠습니다. 감사합니다.

     

    728x90

    'Computer Science > Boostcourse CS50' 카테고리의 다른 글

    5. 메모리  (0) 2021.12.24
    4. 알고리즘  (0) 2021.12.24
    3-2 배열 Queue 구현  (0) 2021.12.24
    3-1 학점 계산 프로그램  (0) 2021.12.24
    3. 배열  (0) 2021.12.24

    댓글

Designed by Tistory.