백준 - JAVA/정렬

[백준] 10814번 : 나이순 정렬 _ JAVA ( 주석 설명 )

wch_s 2023. 2. 10. 15:46

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); //나이순, 입력순으로 정렬된 회원을 출력한다.
    }
}