Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 백준1253
- stack
- 백준1874
- 백준2751
- 백준2750
- 백준17298
- 백준11724
- 백준11399
- 백준13023
- 백준2018
- 백준11003
- 백준1546
- 백준1377
- 백준_구간합구하기
- 백준12891
- 구간합
- 백준1427
- 백준1260
- 백준1517
- 백준_11659
- 백준1940
- 백준11720
- Java
- 자바
- 백준11286
- 백준10998
- 백준
- 정렬알고리즘
- 버블소트
- 백준2023
Archives
- Today
- Total
HOONDOC
[백준]1377 버블 소트 - 자바/Java 본문
1377번: 버블 소트
🌱풀이
알고리즘
- 버블 소트 알고리즘에서 Swap이 일어나지 않는 루프는, 정렬이 완료된 상태다.
- 한 루프당 데이터가 왼쪽으로 이동할 수 있는 최대값은 1이다.
- 데이터 정렬 후와 정렬 전의 인덱스를 비교하여 최대로 줄어든(왼쪽으로 이동한) 값을 찾는다.
- Swap이 일어나지 않는지 확인하는 과정에서 1루프가 추가되므로 인덱스 차이 + 1을 출력한다.
아예 버블 소트를 구현하고 정렬해나가는 과정에서 완료된 시점을 찾아 루프를 종료하면 시간 초과가 난다. 자바가 제공하는 Array 라이브러리의 Arrays.sort 는 시간 복잡도가 O(nLOGn) 이므로 시간 초과가 나지 않는다.
메모리 : 70244KB, 시간 : 1540ms
package book_algoTEst;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
public class BOJ_1377 {
public static void main(String[] args) throws NumberFormatException, IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
mData[] A = new mData[N];
for(int i = 0; i<N; i++) {
A[i] = new mData(Integer.parseInt(br.readLine()), i);
}
Arrays.sort(A); // 시간 복잡도는 O(nlogn)
int Max = 0;
for(int i = 0; i<N; i++) {
if(Max < A[i].index - i) Max = A[i].index - i;
}
System.out.println(Max+1);
}
}
/*
* 사용자 정의 class를 class 내부에 선언하려면 static을 선언해야 하고, 아니면 안해줘도 된다.
*/
class mData implements Comparable<mData> {
int value;
int index;
public mData(int value, int index) {
super();
this.value = value;
this.index = index;
}
@Override
public int compareTo(mData o) { // value 기준 오름차순 정렬
return this.value - o.value;
}
}
// 틀린 코드 입니다.
package book_algoTEst;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class BOJ_1377 {
public static int[] number;
public static void main(String[] args) throws IOException {
// 정렬이 완료된 루프의 회차를 출력하라는 문제다.
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
number = new int[N];
boolean flag = true;
for(int i = 0; i<N; i++)number[i] = Integer.parseInt(br.readLine());
for(int i = 1; i<N+1; i++) {
flag = true;
for(int j = 0; j<N-i; j++) {
if(number[j] > number[j+1]) {
Swap(j, j+1);
flag = false;
}
}
if(flag) {
System.out.print(i);
break;
}
}
br.close();
}
public static void Swap(int i, int j) {
int tmp = number[i];
number[i] = number[j];
number[j] = tmp;
}
}
🪴코드 리뷰
사용자 정의 자료구조를 선언하고, 해당 자료구조로 정렬한 뒤 구했다. 로직은 같다.
다만 이 풀이자는 Arrays.sort가 아닌 Collections.sort를 사용했다. Array 라이브러리와 Collection 라이브러리의 차이점에 대해서 정리해두면 도움이 될 것 같다.
🌿메모리 : 71296KB, 시간 : 968ms
💡 풀이자 : shinjy0211
import java.io.*;
import java.util.*;
class NumInfo {
int n,ind;
NumInfo(int n, int ind) {
this.n = n;
this.ind = ind;
}
}
public class Main {
static int N;
static int ans = -1;
static ArrayList<NumInfo> list = new ArrayList<>();
public static void main(String args[]) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
N = Integer.parseInt(br.readLine());
for(int i=0; i<N; i++) {
int n = Integer.parseInt(br.readLine());
list.add(new NumInfo(n, i));
}
Collections.sort(list,(a,b) -> {
return a.n - b.n;
});
for(int i=0; i<N; i++) {
int mc = list.get(i).ind - i;
if(ans < mc) ans = mc;
}
System.out.println(ans + 1);
}
}
아래 사용자도 Collection.sort를 사용했다. Collection 라이브러리의 정렬 알고리즘 성능이 더 뛰어난 것 같다. 다만 정렬 기준을 커스터마이징 하는 데에서 차이가 있었다.
🌿메모리 : 67304KB, 시간 : 796ms
💡 풀이자 : ugs1575
import java.io.*;
import java.util.ArrayList;
import java.util.Collections;
class Pair_1377 implements Comparable<Pair_1377>{
int index;
int number;
public Pair_1377(int index, int number) {
this.index = index;
this.number = number;
}
@Override
public int compareTo(Pair_1377 o) {
if (this.number < o.number) {
return -1;
} else if (this.number == o.number) {
return 0;
} else {
return 1;
}
}
}
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
ArrayList<Pair_1377> numbers = new ArrayList<>();
for (int i = 0; i < n; i++) {
numbers.add(new Pair_1377(i, Integer.parseInt(br.readLine())));
}
Collections.sort(numbers);
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int max = 0;
for (int i = 0; i < n; i++) {
int diff = numbers.get(i).index - i;
if (diff > 0 && diff > max) {
max = diff;
}
}
bw.write(max+1+"\\n");
bw.flush();
bw.close();
}
}
Conclusion
- 사용자 정의 class에서 정렬의 기준을 커스터마이징 하는데는 두 방법이 있다.Collection.sort(list, (a,b) → { 정렬 조건 }) 을 하던가.
- Collection과 Array를 정리하면서 같이 포스팅 해봐야겠다.
- class 내부에서 implements Comparable<className> 을 하던가,
- 알고리즘이 어려워질수록 구현 실력보다는 발상의 문제인 것 같다..
'문제 풀이 > BAEKJOON' 카테고리의 다른 글
[백준]2750 수 정렬하기 1 - 자바/Java (0) | 2023.01.02 |
---|---|
[백준]1427 소트인사이드 - 자바/Java (0) | 2023.01.02 |
[백준]2750 수 정렬하기 1 - 자바/Java (0) | 2022.12.31 |
[백준]11286 절댓값힙 - 자바/Java (0) | 2022.12.31 |
[백준]1253 좋다 - 자바/Java (0) | 2022.12.31 |