인프런 워밍업 클럽 2기 - CS 전공지식 스터디 특별미션

인프런 워밍업 클럽 2기 - CS 전공지식 스터디 특별미션

특별미션

 

특별 미션) 실수로 워밍업 클럽 출석을 빼먹었는데 우연히 데이터를 수정할 수 있는 권한이 주어졌습니다. 러너분의 이름(name)과 출석수(count)가 저장된 배열에서 여러분(나)의 데이터를 퀵정렬을 이용해 오름차순 정렬하고 가장 첫 번째 데이터인 여러분의 출석수를 변경하도록 코드를 작성해주세요. (퀵정렬 구현 부분도 변경)

 

import java.util.Arrays;

public class QuickSort {

  public static void main(String[] args) {
    User[] arr = {
        new User("홍길동", 5),
        new User("임꺽정", 4),
        new User("이순신", 3),
        new User("나", 1),
        new User("짱구", 5)
    };

    System.out.println("===== 정렬 전 =====");
    System.out.println(Arrays.toString(arr));

    // 퀵정렬 실행
    quickSort(arr, 0, arr.length - 1);

    // 첫 번째 나의 데이터의 출석수 변경
    arr[0].count = 5;

    System.out.println("===== 정렬 후 =====");
    System.out.println(Arrays.toString(arr));
  }

  // 퀵정렬 함수
  static void quickSort(User[] arr, int left, int right) {
    // 기저조건
    if (left >= right) {
      return;
    }

    int pivotIndex = divide(arr, left, right);
    quickSort(arr, left, pivotIndex - 1);
    quickSort(arr, pivotIndex + 1, right);
  }

  // 배열을 나누고 피벗의 위치를 반환하는 함수
  static int divide(User[] arr, int left, int right) {
    int pivot = arr[left].count; // 피벗은 첫 번째 원소의 count 값
    int leftStartIndex = left + 1;
    int rightStartIndex = right;

    while (leftStartIndex <= rightStartIndex) {
      // 피벗보다 큰 값을 찾을 때까지 왼쪽에서 오른쪽으로 이동
      while (leftStartIndex <= right && arr[leftStartIndex].count <= pivot) {
        leftStartIndex++;
      }

      // 피벗보다 작은 값을 찾을 때까지 오른쪽에서 왼쪽으로 이동
      while (rightStartIndex >= left + 1 && arr[rightStartIndex].count >= pivot) {
        rightStartIndex--;
      }

      // 인덱스가 교차하지 않았으면 값 교환
      if (leftStartIndex < rightStartIndex) {
        swap(arr, leftStartIndex, rightStartIndex);
      }
    }

    // 피벗과 rightStartIndex 교환
    swap(arr, left, rightStartIndex);

    return rightStartIndex;
  }

  // 두 원소의 값을 교환하는 함수
  static void swap(User[] arr, int index1, int index2) {
    User temp = arr[index1];
    arr[index1] = arr[index2];
    arr[index2] = temp;
  }

}

class User {
  String name;
  int count;

  User(String name, int count) {
    this.name = name;
    this.count = count;
  }

  @Override
  public String toString() {
    return "{name: '" + name + "', count: " + count + "}";
  }
}

 

문제를 해결하기 위한 퀵정렬을 수행하고 나의 출석수를 변경하는 코드를 Java로 작성했습니다.
count 기준으로 정렬하고, 정렬된 배열의 첫 번째 데이터인 나의 출석수를 5로 변경하는 로직입니다.

개인 일정때문에 첫번째 OT를 빠졌었는데, 구제될 수 있는 기회가 생겼네요.

감사합니다.!!

댓글을 작성해보세요.

채널톡 아이콘