배열에서 최대값(및 최소값)을 찾는 함수를 갖는 것이 도움이 되는 상황이 많이 있습니다. C에는 내장된 max 함수가 없으므로 이 연습 문제에서는 함수를 하나 만들어 보겠습니다. 그런 다음 도움이 될 수 있는 다가오는 문제 세트에서 사용할 수 있습니다!
Hints
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의 길이만큼 반복해주면 배열의 모든 수에 대해 비교가 가능하다.
간단한 방법이 있는데도 복잡하게 생각한 것 같다.
반복문을 자주 써왔는데도 항상 이런 실수를 하는 거 보면
반복문을 더 많이 반복 학습해야할 듯.... .. ..