본문 바로가기

Education

[부스트 코딩 뉴비 챌린지 2020] week4_미션01

반응형

✔︎ 미션 1.

1. 미션 제목
숫자 애너그램 찾기

 

2. 지시문
‘애너그램’이란 문자를 재배열하여 다른 뜻을 가진 단어로 바꾸는 것을 말합니다. 예를 들면 영어의 ‘tea’와 ‘eat’과 같이, 각 단어를 구성하는 알파벳의 구성은 같지만 뜻은 다른 두 단어를 말합니다. 우리말에는 ‘문전박대’와 ‘대박전문’과 같은 예를 들 수 있습니다. 우리는 문자 대신 숫자를 이용해서 애너그램을 찾는 프로그램을 만들어봅시다. 5자리의 숫자 1쌍이 입력으로 주어지며 애너그램일 경우에는 “True”를 아닐 경우에는 “False”를 출력하도록 합시다. 숫자를 입력받는 부분은 따로 구현하지 않고 프로그램 내부에 배열로 선언하는 것으로 가정하고, 숫자에는 중복이 있을 수 있습니다.

예)
입력값: 12345, 54321 -> 출력값: True
입력값: 14258, 25431 -> 출력값: False
입력값: 11132, 21131 -> 출력값: True


3. 핵심 개념
#애너그램 #정렬알고리즘

 

풀이

문제에서 '입력받는 부분은 따로 구현하지 않고 프로그램 내부에 배열로 선언하는 것으로 가정'하라고 적혀 있는데, 미리 내가 정해진 숫자로 지정해주면 코드가 너무 재미없을 것 같았다.

그래서 오랜만에 난수 함수를 이용하여 프로그램을 실행할 때마다 다른 숫자 5개로 구성된 배열 2개를 구성하도록 했다.

난수 함수를 이용하니 코드가 이전보다 덜 지루하다!

#include <stdio.h>
#include <stdlib.h>     //rand()함수
#include <time.h>       //time()함수

/* 숫자 애너그램 찾기*/
//오름차순 정리 후, 두 배열이 같은지 확인

const int LENGTH = 5;

int num1[LENGTH] = {};
int num2[LENGTH] = {};

void random_sort(int arr[], int length, int num);
void bubble_sort(int arr[], int length);
void print(int arr[]);
char* anagram(int arr1[], int arr2[], int length);

int main(void){
    srand(time(0)); //time(): 프로그램을 실행할 때마다 난수가 변경됨(1초 단위로 변경)

    printf("입력값: ");
    random_sort(num1, LENGTH, rand());
    printf(", ");
    random_sort(num2, LENGTH, rand());

    printf(" -> 출력값: ");
    print(num1);
    printf(", ");
    print(num2);
    printf(" (%s)\n", anagram(num1, num2, LENGTH));

    return 0;
}

void random_sort(int arr[], int length, int num){
    for(int i = 0; i < length; i++){
        // printf("num1: ");
        // print(num1);
        // printf(", num2: ");
        // print(num2);
        // printf("\n");
        arr[i] = (rand()+num%100)%9+1;    //1~9의 랜덤 숫자 지정
    }
    print(arr);

    bubble_sort(arr, length);
}


void bubble_sort(int arr[], int length){
    int temp;

    for (int i=0; i<length; i++){
        for (int j=0; j<length-i-1; j++){
            if (arr[j] > arr[j+1]){
                temp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1] = temp;
            }
        }
    }
}

void print(int arr[]){
    for(int i=0; i<5; i++){
        printf("%d", arr[i]);
    }
}

char* anagram(int arr1[], int arr2[], int length){
    for(int i=0; i<length; i++){
        if(arr1[i] != arr2[i]){
            return "False";
        }
    }
    return "True";
}

 

 

추가 질문

미션을 하면서 저희조는 포인터 부분을 이해하는데 많은 어려움이 있었는데요. 이번주 미션을 풀 때 포인터 개념이 꼭 필요 한지 여쭤보고 싶습니다. 진도 상 아직 안 배운 부분인데 포인터를 사용해야만 풀 수 있는 이번 미션을 낸 건가 궁금합니다. 그리고 혹시라도 포인터 사용 없이 풀 수 있는 풀이가 있다면 궁금합니다.

 

RAN코치's 미션 Review

4주차 미션 제출 확인했습니다! 수고하셨습니다.

정말 잘 하셨습니다. 더 말씀드릴 부분이 없을 것 같습니다.

질문하신 포인터 부분에 대해서는, 마지막의 anagram에서만 포인터를 활용하신 것 같습니다. 여기서 포인터를 사용하지 않으시려면 anagram 함수를 없애고 함수의 body 부분을 그대로 main 함수에 넣으시면 됩니다. 또는, Team 2-9의 코드처럼 anagram 함수의 return type boolean으로 설정할 수도 있겠습니다.

다시 한번 수고하셨다는 말씀을 드리며, 5주차도 파이팅입니다!

반응형