알고리즘
[백준] 10814번 : 나이순 정렬 _ JAVA ( 주석 설명 ) 본문
1번
→ Arrays.sort(T[] a, Comparator<? super T> c) 에서
Comparator 의 compare 를 재정의 함으로써 원하는 정렬(나이순, 가입∙입력순)을 한다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); //빠른 입력을 위해 버퍼를 이용해 입력을 받는다.
StringTokenizer st;
StringBuilder sb = new StringBuilder(); //빠른 출력을 위해 StringBuilder를 사용한다.
int N = Integer.parseInt(br.readLine()); //회원의 수를 입력받는다.
String[][] ary = new String[N][2]; //회원의 수만큼의 배열 공간을 만든다.
for(int i=0;i<N;++i){
st = new StringTokenizer(br.readLine()); //StringTokenizer는 개행을 할 때마다 소모되는 객체이므로 개행마다 정의를 해준다.
String age = st.nextToken(); //나이, 다음 토큰으로 받아온 토크나이저를 age 에 저장한다.
String name = st.nextToken(); //이름, 다음 토큰으로 받아온 토크나이저를 name 에 저장한다.
ary[i][0] = age; //0열에는 나이
ary[i][1] = name; //1열에는 이름
}
Arrays.sort(ary, (a,b)->{
if(a[0] == b[0])
return 1; //0이어도 무관, 나이가 같을 경우는 입력한 순서 그대로 보존하기 위해 아무것도 바꾸지 않는다.
else
return Integer.parseInt(a[0]) - Integer.parseInt(b[0]); //나이가 다를 경우, 나이순으로 오름차순 정렬
});
for(int i=0;i<N;++i){
sb.append(ary[i][0] + " " + ary[i][1]).append('\n'); //나이순, 가입순(입력순)으로 정렬된 배열을 StringBuilder에 저장한다.
}
System.out.println(sb); //조건에 만족한 정렬값을 출력한다.
}
}
2번
→ 나이와 이름을 갖는 Person 객체 배열을 먼저 생성하고, Person 객체 배열을 문제의 조건대로 정렬을 한다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.Comparator;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); //빠른 입력을 위해 버퍼를 이용해 입력을 받는다.
StringTokenizer st;
StringBuilder sb = new StringBuilder(); //빠른 출력을 위해 StringBuilder를 사용한다.
int N = Integer.parseInt(br.readLine()); //회원의 수를 입력받는다.
Person[] ary = new Person[N]; //회원 수만큼 Person 객체 배열 생성
for(int i=0;i<N;++i){
st = new StringTokenizer(br.readLine()); //개행이 일어날 때마다 소모되는 객체이므로, 개행마다 정의해준다.
int age = Integer.parseInt(st.nextToken());
String name = st.nextToken();
ary[i] = new Person(age, name); //입력받은 나이, 이름으로 Person 객체를 생성한다.
}
Arrays.sort(ary, Comparator.comparingInt(a -> a.age)); //나이순으로 비교, 나이가 같으면 입력한(기존) 순서대로 오름차순 정렬한다.
/*
Arrays.sort(ary, (a,b) ->{
return a.age - b.age;
});
*/
for(int i=0;i<N;++i) {
sb.append(ary[i]); //객체배열의 객체를 출력하면 해당 인덱스 객체의 toString()이 출력된다.
}
System.out.println(sb); //나이순, 입력순으로 정렬된 회원을 출력한다.
}
public static class Person {
int age; //회원 나이
String name; //회원 이름
public Person(int age, String name){ //생성자
this.age = age;
this.name = name;
}
public String toString(){ //Person 객체를 출력하기 위한 재정의이다.
return age + " " + name + "\n";
}
}
}
3번
→ Counting 정렬과 유사하게 정렬 우선순위를 기준으로 StringBuilder[] 공간을 생성한 뒤,
전체 공간(N)을 탐색하며 정렬된 값을 출력한다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
/* 시간 복잡도 : O(n)
공간 복잡도 : 나이 범위만큼의 배열 공간 생성
*/
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); //빠른 입력을 위해 버퍼를 이용해 입력을 받는다.
StringTokenizer st;
int N = Integer.parseInt(br.readLine()); //회원의 수를 입력받는다.
StringBuilder[] ary = new StringBuilder[201]; //나이를 기준으로 정렬을 하므로, 나이 입력범위에 해당하는 공간을 생성한다.
for(int i=0;i<ary.length;++i){ //초기화를 해주지 않으면 StringBuilder[] ary에 전부 null이 들어간다.
ary[i] = new StringBuilder();
}
for(int i=0;i<N;++i){
st = new StringTokenizer(br.readLine()); //개행이 일어날 때마다 소모되는 객체이므로, 개행마다 정의해준다.
int age = Integer.parseInt(st.nextToken());
String name = st.nextToken();
//나이가 기준이므로, 나이 인덱스에 정보(나이, 이름)를 넣어준다.
//나이가 같을 시, 입력순대로 정보가 차곡차곡 쌓인다.
ary[age].append(age + " " + name).append('\n');
}
StringBuilder sb = new StringBuilder(); //빠른 출력을 위해 StringBuilder를 사용한다.
for(StringBuilder person : ary){ //StringBuilder[] ary에 정보가 있으면 출력 sb에 저장한다.
sb.append(person); //2번 코드 : StringBuilder 에는 toString이 잘 정의되어 잇다.
}
System.out.println(sb); //나이순, 입력순으로 정렬된 회원을 출력한다.
}
}
'백준 - JAVA > 정렬' 카테고리의 다른 글
[백준] 24060번 : 알고리즘 수업 - 병합 정렬 1 _ JAVA ( 주석 설명 ) (0) | 2023.02.13 |
---|---|
[백준] 18870번 : 좌표 압축 _ JAVA ( 주석 설명 ) (0) | 2023.02.10 |
[백준] 1181번 : 단어 정렬 _ JAVA ( 주석 설명 ) (0) | 2023.02.09 |
[백준] 11651번 : 좌표 정렬하기 2 _ JAVA ( 주석 설명 ) (0) | 2023.02.09 |
[백준] 11650번 : 좌표 정렬하기 _ JAVA ( 주석 설명 ) (0) | 2023.02.09 |