본문 바로가기
Computer/Algorithm_Java

[BaekJoon] 2751번 수 정렬하기2 문제풀이 (Success)

by HJ0216 2023. 7. 29.
 

2751번: 수 정렬하기 2

첫째 줄에 수의 개수 N(1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄부터 N개의 줄에는 수가 주어진다. 이 수는 절댓값이 1,000,000보다 작거나 같은 정수이다. 수는 중복되지 않는다.

www.acmicpc.net

 

Language: Java

 

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
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
 
public class Main {
 
    public static void main(String[] args) throws IOException {
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
 
        int cnt = Integer.parseInt(br.readLine());
 
        List<Integer> intList = new ArrayList<>();
 
        while (cnt-- > 0) {
            intList.add(Integer.parseInt(br.readLine()));
        }
 
        Collections.sort(intList);
 
        for (int i = 0; i < intList.size(); i++) {
            if (i == intList.size() - 1) {
                bw.write(intList.get(i) + "");
            } else {
                bw.write(intList.get(i) + "\n");
            }
        }
 
        bw.flush();
        bw.close();
 
    }
 
}
 
 
 

🤔 해설

1. while 반복문

    - 입력될 숫자 개수를 1씩 감소시키면서 반복문 진행

2. Collections Lib

    - ArrayList를 사용하여 Collections 라이브러리에 있는 sort 사용

 

😮 이 외의 풀이

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
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
 
public class Main {
 
    public static void main(String[] args) throws IOException {
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
 
        int cnt = Integer.parseInt(br.readLine());
 
        StringBuffer sb = new StringBuffer();
 
        boolean[] bArr = new boolean[2000001];
 
        for (int i = 0; i < cnt; i++) {
            bArr[Integer.parseInt(br.readLine()) + 1000000= true;
        }
 
        for (int i = 0; i < bArr.length; i++) {
            if (bArr[i]) {
                sb.append(i - 1000000).append("\n");
            }
        }
 
        bw.write(sb + "");
 
        bw.flush();
        bw.close();
 
    }
 
}
 
 
 

1. boolean[]

    - 입력값의 범위만큼 boolean[] 생성

    - 중복값이 없으므로 값이 입력될 경우, false → true 변경

2. StringBuffer

    - 입력된 값의 boolean[]값이 true이므로 true일 경우에만 sb에 append

    - 배열 위치 지정 시, 절대값을 양수화하기위해 +1,000,000 했으므로 append 시에는 다시 실제 숫자를 반영하기 위해 -1,000,000 처리

 

⭐ 계수 정렬을 활용하면, 처리 속도가 1/2배가 된다!

* 계수 정렬(Counting Sort): 데이터 값을 직접 비교하지 않고, 단순하게 각 숫자가 몇 개 있는지 개수를 세어 저장한 후에 정렬하는 알고리즘

 

 

 

🔗 소스 코드
HJ0216/TIL/BOJ

 

📚 참고 자료

 

[Java] ArrayList 정렬하기 (오름차순, 내림차순, 사용자 정의)

Collections.sort() 오름차순으로 정렬하기 내림차순으로 정렬하기 대소문자 구분없이 정렬하기 List.sort() - Java 8 이후 오름차순으로 정렬하기 내림차순으로 정렬하기 대소문자 구분없이 정렬하기 사

hianna.tistory.com

 

[백준] 2751번 : 수 정렬하기 2 - JAVA [자바]

www.acmicpc.net/problem/2751 2751번: 수 정렬하기 2 첫째 줄에 수의 개수 N(1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄부터 N개의 줄에는 숫자가 주어진다. 이 수는 절댓값이 1,000,000보다 작거나 같은 정수이다.

st-lab.tistory.com