인프런 워밍업 클럽 2기 - CS 전공지식 스터디 특별미션
21일 전
특별미션
특별 미션) 실수로 워밍업 클럽 출석을 빼먹었는데 우연히 데이터를 수정할 수 있는 권한이 주어졌습니다. 러너분의 이름(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를 빠졌었는데, 구제될 수 있는 기회가 생겼네요.
감사합니다.!!
댓글을 작성해보세요.