본문 바로가기
웃음기 있는 글들/C

프로그래머스 중앙값 구하기(버블 정렬)

by pon9 2024. 10. 22.

 

바깥쪽 반복문 i:

배열의 전체 패스를 관리한다. 한 패스에서 배열에서 가장 큰 값을 끝으로 보내고, 그 다음 패스에선 다음으로 큰 값을 뒤로 보내고 나머지 부분을 정렬한다.

array_len - 1번 반복하는 이유는 마지막 남은 요소는 정렬이 필요 없기 때문이다.

 

안쪽 반복문 j:

배열 내의 인접한 요소를 반복적으로 비교하여 인접한 두 요소를 교환할지 여부를 결정한다.

array_len - i - 1까지 반복하는 이유는 이미 정렬된 마지막 부분은 건너뛰어도 되기때문이다. 

i가 커질수록 마지막 부분은 이미 정렬된 상태가 되므로 굳이 비교하지 않는다.

 

인접한 두 요소 비교 (array[j] > array[j + 1]):

배열의 array[j]와 array[j + 1] 두 요소를 비교하여, 앞쪽 값이 더 크다면 교환한다. 이렇게 하면 큰 값이 점점 뒤쪽으로 밀려난다.

 

값을 교환하는 과정:

두 인접한 요소를 교환하기 위해 temp 변수를 사용하여 한쪽 값을 임시로 저장한다.

  • temp = arr[j]; 배열의 array[j] 값을 임시 저장소인 temp에 보관한다.
  • arr[j] = arr[j + 1]; array[j]에 array[j + 1]의 값을 대입한다.
  • arr[j + 1] = temp; array[j + 1]에 원래의 array[j] (temp에 보관해 두었던) 값을 넣어준다.

이렇게 하면 arr[j]와 arr[j + 1]의 자리가 바뀌게 된다.

 

마지막으로 array[array_len/2]로 배열의 중앙값을 리턴한다. 문제에서 array_len은 홀수다.

array의 첫번째 요소는 array[0]이고, array_len가 5라면 중앙값은 array[2]이므로 /2만 하면 된다.

 

 

처음엔 바보처럼 array[0]을 생각 못하고 (array_len / 2) + 1 을 해버렸다 ㅋㅋ

 

다른 풀이를 보니 함수와 포인터를 활용하면 훨씬 편하게 풀 수 있는 것 같다. 이제 슬슬 포인터를 공부해야겠다..