[This is CS50 2024] After Week3 - 알고리즘 #Max

moonstrnck·2024년 1월 30일

CS50

목록 보기
9/13


[CS50 Practice - #max]

Max

Learning Goals

  • 배열을 함수에 전달
  • 최대값을 찾는 도우미 함수 만들기

Background

배열에서 최대값(및 최소값)을 찾는 함수를 갖는 것이 도움이 되는 상황이 많이 있습니다. C에는 내장된 max 함수가 없으므로 이 연습 문제에서는 함수를 하나 만들어 보겠습니다. 그런 다음 도움이 될 수 있는 다가오는 문제 세트에서 사용할 수 있습니다!

Hints

  • 최대값을 추적하는 변수로 시작하세요. 이를 초기화하는 방법에는 두 가지가 있습니다. 가능한 가장 낮은 값을 사용하여 시작하거나(최대 값은 음수가 될 수 있으므로 0으로 시작하지 않도록 주의하세요!) 배열의 첫 번째 요소부터 시작할 수 있습니다.
  • 배열을 반복하면서 더 큰 값을 찾을 때마다 이 최대값을 재설정하세요.

Demo

Demo 보기

Getting Started

  1. GitHub 계정을 사용하여 cs50.dev에 로그인합니다.
  2. 터미널 창 내부를 클릭하고 cd를 실행합니다.
  3. 코드 공간에 max.zip이라는 zip을 다운로드하려면 wget https://cdn.cs50.net/2022/fall/labs/3/max.zip을 실행하고 Enter를 누르세요. wget과 다음 URL 또는 해당 문제에 대한 다른 문자 사이의 공백을 간과하지 않도록 주의하세요!
  4. 이제 unzip max.zip을 실행하여 max라는 폴더를 만듭니다.
  5. 더 이상 ZIP 파일이 필요하지 않으므로 rm max.zip을 실행하고 프롬프트에서 "y"와 Enter를 차례로 입력하면 됩니다.

Implementation Details

main 함수는 배열을 초기화하고 사용자에게 값을 입력하도록 요청한 다음 배열과 항목 수를 max 함수에 전달합니다. 배열의 모든 요소를 ​​반복하여 max 함수를 완성하고 최대값을 반환합니다.

생각해보기

Max 도우미 기능을 활용하면 어떤 유형의 프로그램이 도움이 될 수 있다고 생각하시나요?

나의 풀이

// Practice writing a function to find a max value

#include <cs50.h>
#include <stdio.h>

int max(int array[], int n);

int main(void)
{
    int n;
    do
    {
        n = get_int("Number of elements: ");
    }
    while (n < 1);

    int arr[n];

    for (int i = 0; i < n; i++)
    {
        arr[i] = get_int("Element %i: ", i);
    }

    printf("The max value is %i.\n", max(arr, n));
}

// TODO: return the max value
int max(int array[], int n)
{
    // 내림차순 선택정렬
    int highest_index;
    for (int i = 0; i < n; i++)
    {
        highest_index = i;

        for (int j = i + 1; j < n; j++)
        {
            if (array[highest_index] < array[j])
            {
                highest_index = j;
            }
        }
        int tmp = array[i];
        array[i] = array[highest_index];
        array[highest_index] = tmp;

        printf("Sorted Element %i: %i\n", i, array[i]); // 정렬 후
    }
    return array[0];
}

우선 배열을 내림차순으로 정렬한 후, 정렬된 배열의 첫번째 요소가 가장 큰 값이므로
정렬된 배열의 첫번째 요소를 반환하는 방식으로 풀이했다.
정렬은 이전 temps 과제에서 참고했던 해외 유튜브(https://www.youtube.com/watch?v=19HBmVPGxBA)의 선택정렬 풀이를 적용했다.
내가 풀이했던 선택 정렬 풀이가 다른 점이 존재함.

버블 정렬과 동일하게 교환 횟수를 count하는 방식으로 하되, 선택 정렬은 첫번째 요소와 나머지 요소들을 비교한 후 첫번째 요소보다 큰 값이 나타나면 그 위치를 변경해주어야한다. 그 다음 첫번째 요소는 제외하고 그 다음 요소와 나머지 요소들을 비교한다. 교환이 없을 때까지 이를 반복한다. 즉, 비교하는 대상의 index가 ++ 되어야 한다고 생각했다.
그래서 0 부터 시작하는 임의의 start 변수를 설정하고,
for문의 시작지점을 start로 설정 (int i = start; i < n; i ++)
for문이 종료된 후 start를 카운트업 해줬다. 또한 값 교환 자체도 for문 안에서 이뤄진다.
값 교환이 for문에서 이뤄지는 점에서 불필요한 교환이 일어나는 듯한..
정확히는 아직 문제점을 모르겠다 더 찾아봐야지

++ 추가 풀이 (유튜브 풀이 참고)

// TODO: return the max value
int max(int array[], int n)
{
   int max_value = array[0]; // 첫번째 요소가 max_value로 가정
   for (int i = 1; i < n; i++)
   {
   		if (max_value < array[i])
        {
        	max_value = array[i];
        }
   }
   
   return max_value;
}

정렬이 굳이 필요하지 않은 문제다. 먼저 배열의 첫번째 요소가 max_value로 가정 후
반복문으로 max_value가 array[i]보다 작다면 해당 array[i] 값을 max_value로 변경,
이를 array의 길이만큼 반복해주면 배열의 모든 수에 대해 비교가 가능하다.
간단한 방법이 있는데도 복잡하게 생각한 것 같다.
반복문을 자주 써왔는데도 항상 이런 실수를 하는 거 보면
반복문을 더 많이 반복 학습해야할 듯.... .. ..

0개의 댓글