본문 바로가기

건승하고있어요/알고리즘

[sort] 오름차순 버블정렬

반응형

문제: 숫자 N개를 입력받고 그 N개를 오름차순으로 정렬하되 중복된 숫자는 한 번만 나타낸다.

(출처:https://www.acmicpc.net/problem/2750)


알고리즘을 공부한지 얼마 되지 않아 코드들이 조금은 난잡하다.

어떻게 풀어가야 할지 구상하고 시작하는게 아니라 우선 시작해보자! 하는 마음에 1부터 막 쓰기 시작해서 인것 같다.


예전에 학원에 다니면서 스터디를 할 때 온갖 sort를 공부한 적이 있었는데, 진심 하나도 기억이 안나고 딱 버블소트 하나 기억이 나더라. 그래서 우선은 버블소트로 짜기로 했다. 


받자마자 바로 떠올리기 어려웠던 것은 temp 즉 임시자리를 정해놓는 것, 

소트는 결국 자리바꾸기 하는 거라서 이전에 저장된 데이터를 잠시 옮겨놓을 곳이 필요한데 그거 선언하기까지가 참 어려웠던 부분이었던 것 같다. 비슷한 예로 cnt 만들어 놓고 ++ 해주는 게 처음에 떠올릴 때 되게 어려웠었는데.


버블소트는 첫번째 있는 숫자와 옆자리에 있는 숫자를 비교해서 첫번째 있는 숫자가 더 크면 옆에 있는 숫자와 자리를 바꿔주는 아주 단순한 정렬이다. 대신에 포문을 돌릴 때 맨 마지막 숫자의 경우 다음 숫자가 없으므로 N번째까지 돌려버리면 에러가 난다. 내가 지겹도록 마주했던 에러다. ★java.lang.ArrayIndexOutOfBoundsException★ 


그렇게 버블소트로 정렬까지는 해냈는데, 중복제거에서 또 고민이 많았다.

마찬가지로 옆에있는 숫자랑 같지 않은 경우만 출력을 하도록 했는데, 그렇게 되면 포문을 array.length-1로 해야해서 출력할 때 마지막 숫자가 나오지를 않는다. 그래서  어찌해야하나 고민을 또 하고하고 또 했다.


친구의 힌트로 실마리를 풀었다. 이전 숫자를 prev라는 변수에 집어넣은 뒤 마지막 숫자까지 확인을 하는 방법으로, 그래서 포문시작을 i=0이 아니라 i=1부터 시작해서 i<array.length 로 끝까지 돌릴 수 있게.


그랬더니 첫번 째 숫자가 안나오지 당연히.

ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

그래서 그냥 편하게 포문 돌리기 전에 array[0]을 찍어주고 array[1]부터 검사시작으로 돌렸다.


어찌됐든 돌아가고 채점해서 맞았당! ㅋㅋㅋㅋㅋㅋㅋ



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
import java.util.Scanner;
 
public class Sort1 {
 
    public static void main(String[] args) {
        
//숫자 입력받음
        Scanner scan = new Scanner(System.in);
        System.out.println("숫자를 입력해 주세요: ");
        int N = scan.nextInt();
//입력받은 숫자가 범위 안에 있는지 확인하는 while문
        boolean YN = true;
        
       
        
        while(YN) {
            if(N<1 || N>1000) {
                System.out.println("다시 입력해주세요");
                N = scan.nextInt();
            } else {
                YN = false;
            }
        }
        
 System.out.println(N + "개의 숫자를 입력해 주세요.");

        int [] array = new int [N];
        int temp = 0; //임시위치를 위한 변수선언
        int Number = 0;
        
        //N개 입력하겠다고 했으니 그 N개만큼 숫자입력 //배열에 집어넣기 - 각각의 숫자를 비교하기 위해서
        for(int i=0; i<N ; i++) {
            Number = scan.nextInt();
            array[i] = Number;
        }

        
        for(int i=0 ; i<array.length-1 ; i++) {
            for(int j=0 ; j<array.length-1 ; j++) {
                if(array[j]>array[j+1]) {
                    temp = array[j];
                    array[j] = array[j+1];
                    array[j+1= temp;
                }
            }
        }
        
//중복확인을 위한 포문 돌리기
        int prev = array[0];
        
        System.out.print(prev + " ");
        for(int i=1 ; i<array.length ; i++) {
            if(prev != array[i]) {
                System.out.print(array[i] + " ");
                prev = array[i];
                
            }
            
        }
        
        
        scan.close();
    }
}
 

cs




반응형