[백준] 나이순 정렬(자바)
알고리즘 문제 풀이를 블로그에 올리는 이유는 풀이, 코드를 기록하기 위함이니
앞으로 문제를 다 긁어오기보다 링크만 두고 풀이가 잘 보이도록 포스팅 할 예정입니다!
📄 문제
👩💻 풀이
1. 문제 이해
이 문제는 입력된 <나이, 이름> 값들을
- 나이순으로
- 나이가 같으면 입력 순서로
정렬하여 출력하는 문제이다.
2. String[][] + compare 메소드 override
- String 타입의 2차원 배열에 나이와 이름 저장
Comparator의 compare 메소드
를override
하여 나이순으로 정렬- 나이순으로 정렬하면서 이름은 비교하지 않으면, 나이순으로 정렬되고 나이가 같은 경우는 입력순으로 정렬됨
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;
int N = Integer.parseInt(br.readLine());
String[][] arr = new String[N][2];
for(int i = 0; i < N; i++) {
st = new StringTokenizer(br.readLine(), " ");
arr[i][0] = st.nextToken();
arr[i][1] = st.nextToken();
}
Arrays.sort(arr, new Comparator<String[]>() {
@Override
public int compare(String[] o1, String[] o2) {
return Integer.parseInt(o1[0]) - Integer.parseInt(o2[0]);
}
});
StringBuilder sb = new StringBuilder();
for(int i =0; i < N; i++) {
sb.append(arr[i][0]).append(" ").append(arr[i][1]).append("\n");
}
System.out.println(sb);
}
}
3. String[][] + Comparator.comparingInt()
- String 타입의 2차원 배열에 나이와 이름 저장
Comparator의 comparingInt 메소드
+람다식
으로 나이순 정렬
사실 Comparator를 이번에 처음 써봐서 연습할 겸 위의 풀이를 람다식으로 바꾸고 있었는데 똑똑한 인텔리제이가 이 메소드를 추천해주었다 호오!- 위와 마찬가지로 나이가 같을 때는 입력순으로 정렬됨
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;
int N = Integer.parseInt(br.readLine());
String[][] arr = new String[N][2];
for(int i = 0; i < N; i++) {
st = new StringTokenizer(br.readLine(), " ");
arr[i][0] = st.nextToken();
arr[i][1] = st.nextToken();
}
Arrays.sort(arr, Comparator.comparingInt(o -> Integer.parseInt(o[0])));
StringBuilder sb = new StringBuilder();
for(int i =0; i < N; i++) {
sb.append(arr[i][0]).append(" ").append(arr[i][1]).append("\n");
}
System.out.println(sb);
}
}
4. StringBuilder (가장 좋은 성능👍)
코드 출처 : Stranger's LAB
st_님(닉네임이 이게 맞으실까..?)의 Stranger's LAB에 가면 하나의 문제에 대해 다양한 풀이가 있고,
마지막에 각 풀이의 성능도 비교해주셔서 문제를 풀고나서도 종종 찾아가 구경한다.
이번에도 나는 전혀 생각 못한 놀라운 풀이를 발견해서 클론 코딩하면서 이해하려고 노력했다!
- 입력되는 나이의 범위만큼의 크기를 가진 StringBuilder 배열을 만들고
- 해당 배열 안에 StringBuilder를 만들어 담음
- 나이값을 인덱스로 배열의 위치를 지정하여 입력값을 append
- 기본적으로 인덱스인 나이를 기준으로 정렬되고, 나이가 같을 때에는 먼저 입력된 것 뒤에 나중에 입력된 것이 append 되기 때문에 별도 정렬 과정 없이 정렬됨
- StringBuilder가 담긴 배열을 순회하면서 전체를 하나로 append 후 출력
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
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;
int N = Integer.parseInt(br.readLine());
// 입력되는 나이의 범위 : 1 ~ 200
StringBuilder[] sba = new StringBuilder[201];
for(int i = 0; i < sba.length; i++) {
sba[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();
sba[age].append(age).append(" ").append(name).append("\n");
}
StringBuilder sb = new StringBuilder();
for(StringBuilder s : sba) {
sb.append(s);
}
System.out.println(sb);
}
}
Author And Source
이 문제에 관하여([백준] 나이순 정렬(자바)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@geesuee/백준-나이순-정렬자바저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)