문제: 숫자 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(); } } |
'건승하고있어요 > 알고리즘' 카테고리의 다른 글
[for문] n의 합 (0) | 2018.01.28 |
---|---|
[별찍기] 요리조리 별찍기 (0) | 2018.01.28 |
[별찍기] 세상 쉬운 별찍기(인데 나는 못함) (0) | 2018.01.28 |
[sort] 설탕배달하기 (0) | 2018.01.28 |
[sort] 두 번째로 큰 숫자 출력하기 (0) | 2018.01.28 |