[백준] 나이순 정렬(자바)

30123 단어 백준백준

알고리즘 문제 풀이를 블로그에 올리는 이유는 풀이, 코드를 기록하기 위함이니
앞으로 문제를 다 긁어오기보다 링크만 두고 풀이가 잘 보이도록 포스팅 할 예정입니다!

📄 문제

[백준] 나이순 정렬


👩‍💻 풀이

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);
    }
}

좋은 웹페이지 즐겨찾기