Algorithm/java 구현

자료구조 (java) :) 버블정렬... 입력받은 값을 버블정렬로 출력하기

euncheol kim 2022. 3. 28. 15:59
package algorithm;

import java.util.Scanner;

public class BubbleSort {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String line = sc.nextLine();
        String[] str = line.split(",");
        Integer[] num = new Integer[str.length];

        // Integer instance의 변수 num에 입력값 저장
        for(int i = 0; i < num.length; i++) {
            num[i] = Integer.parseInt(str[i].trim());
        }

        // BubbleSort 알고리즘
        for (int i = 0; i < num.length; i++){
            for(int j = 1; j < num.length - i; j++) {
                if (num[j - 1] > num[j]) {
                    int temp = num[j];
                    num[j] = num[j - 1];
                    num[j - 1] = temp;
                }
            }
        }


        // 콤마 구분으로 출력하기 위한 작업
        StringBuffer result = new StringBuffer();
        for (int i = 0; i < num.length; i ++){
            result.append(num[i]);
            result.append(", ");
        }

        // result 출력 및 마지막 콤마(,) 제거
        result.deleteCharAt(result.lastIndexOf(", "));
        System.out.println(result.toString());
    }
}

 


 

 버블정렬 알고리즘을 설계하며 느낀점

- 선택정렬을 풀며 느낀점과 100퍼센트 일치

 

java를 활용해 선택정렬 알고리즘을 설계하며 메모리 가용에 대해서 많이 고민했다.

 

[ 고민 1번 ]: 나의 알고리즘에서 적합도가 낮은 String 타입

나의 아이디어는 사용자에게 입력받은 값을 Integer Array에 저장하여 버블정렬 알고리즘을 거친 후,

String 타입의 변수에 담아 String.join(",", 변수명)으로 출력하는 것이었다. String 타입의 연산은 plus operator로 하려고 했으나 이렇게 설계할 경우, JVM의 heap 메모리에 수많은 String instance의 Garbage가 생성되어 힙 메모리 부족이 발생할 수 있다고 생각하게 되었다.

 

※ String 타입은 불변성을 가진다. 이 때문에 plus operator(+)의 연산이 될 경우 String 타입은 plus연산 횟수만큼 instance를 생성하며 이는 heap에 저장된다. (추후 포스팅할 예정)

 

 

[ 고민 1번의 해결 ]: 가변성 있는 StringBuffer를 이용하자

String 타입 대신StringBuffer 타입을 이용하게 되면 나의 고민을 해결할 수 있을 것이라 생각했다.

StringBuffer는 String타입과 달리 단일 instace를 생성하여 문자열을 변경하는 것이 가능하기 때문이다. 즉, StringBuffer는 동일 객체 내에서 문자열을 변경하는 것이 가능하다.

 

StringBuffer에 정렬된 숫자의 사이에 콤마(,)로 구분하기 위해 사이사이에 StringBuffer.append(", ")를 넣어 주었으며 마지막의 콤마(,)를 빼는 방법은 deleteCarAt메소드를... 그리고 인자로는 lastIndexof(",")를 이용해주었다. (추후 포스팅할 예정)