41. 정렬 알고리즘 구현하기: 버블 정렬
버블 정렬(Bubble Sort)은 인접한 두 요소를 비교하고, 정렬이 완료될 때까지 반복하여 정렬하는 간단한 정렬 알고리즘입니다.
문제
버블 정렬 알고리즘을 구현하고 테스트하세요.
코드
// 버블 정렬 구현
List<int> bubbleSort(List<int> arr) {
int n = arr.length;
for (int i = 0; i < n - 1; i++) {
for (int j = 0; j < n - i - 1; j++) {
if (arr[j] > arr[j + 1]) {
// 스왑
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
return arr;
}
void main() {
List<int> data = [64, 34, 25, 12, 22, 11, 90];
print('Original list: $data');
List<int> sortedData = bubbleSort(data);
print('Sorted list: $sortedData');
}
설명
버블 정렬 알고리즘은 리스트를 반복하면서 인접한 요소를 비교하여 정렬합니다. 이 과정은 리스트가 정렬될 때까지 계속됩니다. 위 코드에서 bubbleSort 함수는 리스트를 받아 정렬된 리스트를 반환합니다.
테스트 결과
Original list: [64, 34, 25, 12, 22, 11, 90]
Sorted list: [11, 12, 22, 25, 34, 64, 90]
42. 이진 검색 구현하기
이진 검색(Binary Search)은 정렬된 리스트에서 특정 값을 찾기 위해 사용하는 효율적인 검색 알고리즘입니다.
문제
정렬된 리스트에서 이진 검색을 구현하고 테스트하세요.
코드
// 이진 검색 구현
int binarySearch(List<int> arr, int target) {
int left = 0;
int right = arr.length - 1;
while (left <= right) {
int mid = left + (right - left) ~/ 2;
if (arr[mid] == target) {
return mid;
}
if (arr[mid] < target) {
left = mid + 1;
} else {
right = mid - 1;
}
}
return -1; // 찾지 못한 경우
}
void main() {
List<int> data = [11, 12, 22, 25, 34, 64, 90];
int target = 25;
int result = binarySearch(data, target);
print('Index of $target: $result');
}
설명
이진 검색 알고리즘은 정렬된 리스트를 반으로 나누어 검색 범위를 줄여가며 효율적으로 값을 찾습니다. 위 코드에서 binarySearch 함수는 리스트와 검색할 값을 받아 인덱스를 반환합니다.
테스트 결과
Index of 25: 3
43. 정렬된 리스트 병합하기
두 개의 정렬된 리스트를 병합하여 정렬된 리스트를 만드는 문제입니다.
문제
두 개의 정렬된 리스트를 병합하여 정렬된 리스트를 만드세요.
코드
// 정렬된 리스트 병합하기
List<int> mergeSortedLists(List<int> list1, List<int> list2) {
List<int> mergedList = [];
int i = 0, j = 0;
while (i < list1.length && j < list2.length) {
if (list1[i] <= list2[j]) {
mergedList.add(list1[i]);
i++;
} else {
mergedList.add(list2[j]);
j++;
}
}
while (i < list1.length) {
mergedList.add(list1[i]);
i++;
}
while (j < list2.length) {
mergedList.add(list2[j]);
j++;
}
return mergedList;
}
void main() {
List<int> list1 = [1, 3, 5, 7];
List<int> list2 = [2, 4, 6, 8];
List<int> mergedList = mergeSortedLists(list1, list2);
print('Merged list: $mergedList');
}
설명
두 개의 정렬된 리스트를 병합할 때, 각 리스트의 요소를 비교하며 더 작은 요소를 결과 리스트에 추가합니다. 리스트의 끝까지 도달하면 남은 요소를 모두 추가합니다.
테스트 결과
Merged list: [1, 2, 3, 4, 5, 6, 7, 8]
44. 최대 공약수 계산하기
유클리드 알고리즘을 사용하여 두 숫자의 최대 공약수를 계산하는 문제입니다.
문제
유클리드 알고리즘을 사용하여 두 숫자의 최대 공약수를 계산하세요.
코드
// 유클리드 알고리즘으로 최대 공약수 계산
int gcd(int a, int b) {
while (b != 0) {
int temp = b;
b = a % b;
a = temp;
}
return a;
}
void main() {
int num1 = 48;
int num2 = 18;
int result = gcd(num1, num2);
print('GCD of $num1 and $num2: $result');
}
설명
유클리드 알고리즘은 두 숫자의 나머지를 반복적으로 계산하여 최대 공약수를 찾습니다. gcd 함수는 두 숫자를 받아 최대 공약수를 반환합니다.
테스트 결과
GCD of 48 and 18: 6
45. 소수 판별하기
주어진 숫자가 소수인지 판별하는 문제입니다.
문제
주어진 숫자가 소수인지 판별하세요.
코드
// 소수 판별하기
bool isPrime(int number) {
if (number <= 1) return false;
if (number <= 3) return true;
if (number % 2 == 0 || number % 3 == 0) return false;
for (int i = 5; i * i <= number; i += 6) {
if (number % i == 0 || number % (i + 2) == 0) return false;
}
return true;
}
void main() {
int number = 29;
bool result = isPrime(number);
print('$number is prime: $result');
}
설명
소수는 1과 자기 자신 외에는 아무로 나눠지지 않는 수입니다. isPrime 함수는 입력된 숫자가 소수인지 판별합니다. 효율적인 소수 판별을 위해 제곱근까지 나눠 보며 나머지가 0인지 확인합니다.
테스트 결과
29 is prime: true
이상으로 Dart를 이용한 여러 가지 알고리즘 문제 해결 방법을 소개했습니다.
각 문제에 대한 설명과 코드를 통해 문제를 해결하는 방법을 익힐 수 있기를 바랍니다.
질문이나 추가적인 도움이 필요하시면 언제든지 댓글로 남겨주세요!
'Dart > Dart 100제' 카테고리의 다른 글
Dart 100제 51 ~ 60 (보충 문제) (0) | 2024.08.09 |
---|---|
Dart 100제 46 ~ 50 (고급 주제) (0) | 2024.08.07 |
Dart 100제 36 ~ 40 (비동기 프로그래밍) (2) | 2024.07.24 |
Dart 100제 31 ~ 35 (파일 입출력) (2) | 2024.07.24 |
Dart 100제 26 ~ 30 (Map와 Set) (2) | 2024.07.24 |