[한글 코딩]
배열 크기 입력받으려고 스캐너 클래서 가져옴
배열에 랜덤으로 수를 입력받으려고 랜덤 클래서 가져옴
배열 크기를 1~10으로 정했으니까
아래 명령 계속{ ==> 배열 크기 입력받는거 함수화
"배열의 크기를 입력하세요"
입력 받음
만약(사이즈가 0보다 크고 10보다 작거나 같으면)
탈출
}
아니면 경고 문구 출력
}
입력받은 사이즈 크기의 배열 생성
사이즈 크기 만큼 난수 생성( // 난수 1~100까지 ==> 난수 생성 함수화
아래 명령 실행{
flag = false로 두고 // 중복 아닌 상태
배열에 난수 생성
}
생성된 난수 중복 검사
)
정렬 전
배열 출력 ==> 배열 출력 함수화
1 입력하면 오름차순 정렬
2 입력하면 내림차순 정렬
아래 명령 계속{ ==> 오름차순, 내림차순 선택하는거 함수화
1. 오름차순 출력
2. 내림차순 출력
입력 받음
만약(1이나 2 입력받으면){
그만 입력받아
}
경고 문구 출력
}
배열 크기 -1회전 반복{ ==> 선택정렬 함수화
만약(1 입력받으면){
가장 작은 수를 맨 왼쪽에 넣을거니까
맨 왼쪽을 변수로 두고
두 번재 수부터 오른쪽 수들을
변수 자리값이랑 비교해서
가장 작은 수의 자리값을 선택해서 변수와 자리를 바꿈 => 1회전
0번 인덱스를 제외하고 1번 인덱스를 변수로 두고
2번 인덱스부터 오른쪽 수들을
변수 자리값이랑 비교해서
가장 작은 수의 자리값을 선택해서 변수와 자리를 바꿈 => 2회전
}
아니면{
선택 정렬로 내림차순
}
n회전때마다 정렬된 배열 출력
}
최종 정렬된
배열 출력 ==> 함수화
package day008;
import java.util.Random;
import java.util.Scanner;
public class Selectionsort {
//배열의 크기를 사용자가 입력하는 함수
public static int inputSize(Scanner scanner, int size) {
while (true) {
System.out.print("배열의 크기를 입력하세요 (1~10): ");
size = scanner.nextInt(); // 배열 크기 입력받음
if (size > 0 && size <= 10) { // 1부터 10 사이만 입력 가능
break;
}
System.out.println("잘못된 크기입니다. 1~10 사이의 숫자를 입력해주세요.");
}
return size;
}
// 배열 안의 숫자를 랜덤으로 생성해주고, 중복 방지하는 함수
public static void flagTest(int[] datas, Random random) {
for (int i = 0; i < datas.length; i++) {
while (true) {
boolean flag = false; // boolean 형식으로 중복 확인
datas[i] = random.nextInt(100) + 1; // 1~100 사이의 랜덤 숫자
// 중복 검사
for (int j = 0; j < i; j++) {
if (datas[j] == datas[i]) {
flag = true; // 중복인 경우
break; // 중복이면 다시 반복
}
}
// true로 설정해서 if문 통과
if (!flag) { // 중복이 아닌 경우
break;
}
}
}
}
// 배열 출력하는 함수
public static void printArr(int[] datas) {
for (int num : datas) {
System.out.print(num + " ");
}
System.out.println();
}
// 오름차순, 내림차순 선택하는 함수
public static int ascOrdesc(int ans, Scanner scanner) {
while (true) {
System.out.println("\n정렬 방식을 선택하세요:");
System.out.println("1. 오름차순");
System.out.println("2. 내림차순");
System.out.print("선택 >> ");
ans = scanner.nextInt();
if (ans == 1 || ans == 2) { // 1 또는 2가 아닐 경우
break;
}
System.out.println("잘못된 선택입니다. 1 또는 2를 선택해주세요.");
}
return ans;
}
// 선택 정렬하고 n회차 별로 배열 출력하는 함수
public static void selectionSort(int[] datas, int ans) {
for (int i = 0; i < datas.length - 1; i++) {
int targetIndex = i;
// 오름차순 / 내림차순 선택하기
for (int j = i + 1; j < datas.length; j++) {
if (ans == 1) { // 오름차순
if (datas[j] < datas[targetIndex]) {
targetIndex = j;
}
} else { // 내림차순 가독성 좋게 하려고 else 넣어둠
if (datas[j] > datas[targetIndex]) {
targetIndex = j;
}
}
}
// 값 교환
if (targetIndex != i) {
int tmp = datas[i];
datas[i] = datas[targetIndex];
datas[targetIndex] = tmp;
}
// 각 회차별 정렬 과정 출력
System.out.println((i + 1) + "회전 후 배열");
printArr(datas);
}
}
public static void main(String[] args) {
// 스캐너와 랜덤 객체 생성
Scanner scanner = new Scanner(System.in);
Random random = new Random();
int size = 0; // 배열 크기
size = inputSize(scanner, size); //배열 크기 입력받기
// 배열 생성
int[] datas = new int[size]; //배열 크기 size를 넣음으로써 배열 크기 사용자 설정
// 중복 없이 1~100 사이의 랜덤 숫자로 배열 채우기
flagTest(datas, random); //중복 검사
// 정렬 전 배열 출력
System.out.println("\n정렬 전 배열:");
printArr(datas); //배열 출력
// 정렬 방식 선택
int ans = 0; // scope 이슈
ans = ascOrdesc(ans, scanner); //1. 오름차순, 2. 내림차순 입력 받기
selectionSort(datas, ans); // 선택 정렬 후 회전마다 출력
// 최종 정렬된 배열 출력
System.out.println("\n최종 정렬된 배열:");
printArr(datas); //배열 출력
}
}
main 함수에다가 scanner와 random 객체를 생성하지 않고 필요한 함수에다 객체를 생성하고 진행하면 어떨까? 그리고 변수에다가 초기화하지 말고 함수를 할당해 초기화와 동시에 대입을 하면 더 좋을 것 같다는 생각이 들었다.
main 함수에다가 scanner와 random을 생성하고 인자를 함수에다가 가져온다면 메모리 사용량에 있어서 더 좋은 점이 있지만 웹개발 지향적으로 봤을 때 main에다가 Scanner scanner = new Scanner(System.in);이라고 선언했을 때 함수에서는 인자를 'scanner' 로만 갖고 와야 한다는 단점이 있다. 하지만 함수에서 선언했을 때 sc, scan 등 여러가지로 쓸 수 있게 만들 수 있다는 장점이 있다. 메모리로만 봤을 때는 main에 넣는게 더 낫지만 결합도를 낮추기 위해서는 main 말고 각 함수에 넣는게 더 낫다.
'Back-End' 카테고리의 다른 글
| [JAVA] 기초 공부 8(객체지향) (0) | 2025.01.10 |
|---|---|
| [JAVA] 기초 공부 7(MVC, 오버로딩) (1) | 2025.01.09 |
| [JAVA] 기초 공부 6(함수) (4) | 2025.01.07 |
| [JAVA] IDE와 CONSOLE을 사용해 포켓몬 프로그램 만들기 (1) | 2025.01.06 |
| [JAVA] 삽입정렬(insertion sort) (1) | 2025.01.04 |