인프런 커뮤니티 질문&답변

최규형님의 프로필 이미지

작성한 질문수

홍정모의 따라하며 배우는 C++

6.4 배열과 선택 정렬 selection sort

제가한 선택 정렬 코드 리뷰 가능할까요?

23.08.13 13:40 작성

·

273

1

제가 먼저 풀고, 풀이를 보려 했는데 어지러워서

제가 한게 좀더 간단한거 같아 혹시 다른 분들 의견이 궁금하여 여쭤 볼겸 평가 부탁드립니다

답변 1

1

Soobak님의 프로필 이미지

2023. 08. 13. 18:07

안녕하세요, 답변 도우미 Soobak 입니다.

먼저, 인프런 질문 답변 게시판에서는 코드 리뷰를 제공하지 않습니다.
따라서, 코드 리뷰에 대해서는 선생님의 다른 커뮤니티를 통해 다른 수강생분들과 토론을 나누시는 것을 권장드립니다.
링크를 첨부드립니다.
- 네이버 카페 - 홍정모 연구소 (링크)
- 디스코드 - 홍정모 연구소(링크)

다만, 질문을 읽은 참에 간단히 리뷰를 드려봅니다.

선택 정렬 알고리즘에 대한 기본 원리는 다음과 같습니다.
1. 첫 번째 원소부터 마지막 항목까지 가장 작은(혹은 큰) 원소를 찾습니다.
2. 해당하는 원소를 첫 번째 원소와 교환합니다.
3. 두 번째 원소부터 마지막 원소까지 가장 작은(혹은 큰) 원소를 찾습니다.
4. 해당하는 원소를 두 번째 원소와 교환합니다.
5. 이 과정을 배열의 끝까지 반복합니다.

따라서, 구현하신 코드에는 몇 가지 문제점이 있습니다.
1. j 의 초기값이 (i == 4) ? i - 1 : 0; 이라는 조건으로 시작하는 것은 선택 정렬의 개념과는 맞지 않습니다. 선택 정렬에서는 항상 현재 위치부터 배열의 끝까지 가장 작은(혹은 큰) 값을 찾아야 합니다.
2. 내부의 while() 반복문은 현재 위치 i 보다 작은 모든 값과 현재 위치의 값을 교환하고 있습니다.
따라서, 이 또한 선택 정렬의 원리와 맞지 않습니다.

질문자님의 코드를 기반으로 기본적인 선택 정렬 알고리즘의 형태를 구현해보면 다음과 같습니다.

const int length = 5;
int array[length] = {3, 5, 2, 1, 4};

for (int i = 0; i < length - 1; i++) {
  int minIndex = i;  // 가장 작은 값의 인덱스를 저장할 변수
  for (int j = i + 1; j < length; j++) {
    if (array[j] < array[minIndex]) {
      minIndex = j; // 더 작은 값을 찾았으면, 그 위치를 저장
    }
  }
  // i 위치의 값과 가장 작은 값을 교환
  int temp = array[i];
  array[i] = array[minIndex];
  array[minIndex] = temp;
}