백준 알고리즘 문제(86) - 나이 순 정렬
온라인 회원의 나이와 이름을 오름차순으로 정렬해주는 문제다.
나이가 같다면 입력받은 순서대로 정렬한다.
이전 문제들과 같이 comparator을 활용해서
문자열로 입력받은 나이에 해당하는변수 age를 비교해주고 같을 경우에는 순서에 맞게 출력하도록 해보겠다.
나는 나이를 제외하고는 굳이 순서를 바꿔줄 필요가 없으므로, -1 or 0을 return해주면 입력순으로 나올 것이라고 생각하고 코드를 구상했다. 그리고, 1대1로 직접 비교하거나 문자열을 비교해주는게 아니라 2차원 배열을 비교하므로 람다식을 이용해 풀어냈다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
public class java_io {
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
public static void main(String[] args) throws IOException {
int N = Integer.parseInt(br.readLine());
StringTokenizer st;
String[][] arr = new String[N][2];
for(int i =0; i<N; i++) {
st = new StringTokenizer(br.readLine()," ");
String age = st.nextToken();
String name = st.nextToken();
arr[i][0] = age;
arr[i][1] = name;
}
//같다면 입력 순서대로, 아니라면 오름차순으로
Arrays.sort(arr, (s1, s2) -> {
if(s1[0] == s2[0]) {
return 0;
} else {
return Integer.compare(Integer.parseInt(s1[0]), Integer.parseInt(s2[0]));
}
});
StringBuilder sb = new StringBuilder();
for(int i =0; i<N; i++) {
sb.append(arr[i][0]+" "+arr[i][1]).append('\n');
}
System.out.println(sb);
}
}
이전 포스팅에서 했던 방법들을 내 것으로 만들고 조금만 응용해 틀어줘도 이렇게 바로 풀 수있다.
추가하자면, 이 방법외에도 그냥 comparator을 호출해서 compare 메소드를 사용하는 방법이 있다. Person 클래스를 생성해서 나이와 이름을 입력받아 간편하게 출력하는 형식이다.
두 번째로, 가장 효율이 높은 StringBuilder을 배열로 사용해버리는 방법이다. StringBuilder 자체가 입력을 쌓아두고 한꺼번에 출력하는 방법이기 때문에 메모리 낭비가 적다.
countingsort와 같은 방법을 사용하되, 입력값이 너무 큰 경우에는 메모리 낭비가 생길 수 있으니 조심하도록 해야겠다. 아래는 Stranger's lab에서 클론코딩한 자료다.
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.StringTokenizer;
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());
// 입력되는 나이의 범위 : 1 ~ 200
StringBuilder[] p = new StringBuilder[201];
for(int i = 0; i < p.length; i++) {
p[i] = new StringBuilder();
}
for(int i = 0; i < N; i++) {
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
int age = Integer.parseInt(st.nextToken());
String name = st.nextToken();
// 카운팅 정렬 : 나이를 index 로 하여 해당 배열에 나이와 이름을 append() 한다
p[age].append(age).append(' ').append(name).append('\n');
}
StringBuilder sb = new StringBuilder();
for(StringBuilder val : p) {
sb.append(val);
}
System.out.println(sb);
}
} //출처 : Stranger's lab
Author And Source
이 문제에 관하여(백준 알고리즘 문제(86) - 나이 순 정렬), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@code_alpaca/백준-알고리즘-문제86-나이-순-정렬저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)