멍두의 개발새발

[백준] 나이순 정렬 in Java 본문

Algorithm/BOJ

[백준] 나이순 정렬 in Java

멍두 2024. 7. 30. 16:18
반응형

📍 문제

https://www.acmicpc.net/problem/10814

📍 코드 설명

나이 순으로 정렬하고 나이가 같다면 먼저 입력된 순으로 정렬하는 문제이다.

 

두가지 방법으로 풀어볼수있다.

1. class 를 이용하여 age, name을 입력받고 compareTo를 override하여 age순으로 정렬한다

2. 배열 index로 age를 사용하여 나이와 이름을 저장한다.

📍 코드

✔️ class - compareTo 코드

1. class로 Person을 만들어 age와 name을 변수로 가진다

 

2. Comparable의 compareTo를 구현한다.

이때, 나이를 기준으로 정렬한다

추후 출력에 용이하기 위해 출력 형식에 맞춰 ToString도 구현한다.

 

3. List<Person>으로 입력받고, Collection.sort()하여 나이순으로 정렬한 뒤 출력한다.

더보기
import java.util.*;
import java.io.*;
import java.util.Collections;

class Main {
    static class Person implements Comparable<Person>{
        int age;
        String name;

        public Person(int age, String name){
            this.age = age;
            this.name = name;
        }

        @Override
        public int compareTo(Person person){
            if(person.age < age){
                return 1;
            }else if(person.age > age){
                return -1;
            }
            return 0;
        }

        @Override
        public String toString(){
            return this.age + " " + this.name;
        }
    }

	static public void main(String []args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.parseInt(br.readLine());

        List<Person> list = new ArrayList<>();
        for(int i = 0; i < N; i++){
            StringTokenizer st = new StringTokenizer(br.readLine());
            list.add(new Person(Integer.parseInt(st.nextToken()), st.nextToken()));
        }

        Collections.sort(list);
        for(Person person : list){
            System.out.println(person);
        }
        
    }
}

 

✔️ counting sort 코드

1. 나이가 1 ~ 200 사이로 입력되므로 StringBuilder배열을 200까지 입력받을 수 있도록 크기 201로 선언한다

2. 각 배열마다 stringbuilder를 생성해준다

3. age를 인덱스로 사용하고, 추후 출력형식에 맞춰 stringbuilder를 append한다

4. StrinbBuilder배열을 돌면서 null이 아니라면 출력한다.

더보기
import java.util.*;
import java.io.*;
import java.util.Collections;

class Main {
	static public void main(String []args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.parseInt(br.readLine());    

        StringBuilder[] sbArr = new StringBuilder[201];

        for(int i = 0; i < 201; i++){
            sbArr[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();
            sbArr[age].append(age).append(" ").append(name).append("\n");
        }

        for(StringBuilder str : sbArr){
            if(str != null){
                System.out.print(str);
            }
        }
    }
}

 

두 방법의 시간복잡도 비교

 

위에서부터

1. 배열을 사용한 방법 : 464ms

2. compareTo를 사용한 방법 1600ms

이다

 

📍 기억할 것

compareTo는 시간 복잡도가 매우 안좋은것을 볼 수 있다.

배열을 이용한 countingSort는 O(n+데이터입력크기)이므로 countingSort를 이용할 수 있다면 최대한 사용하는 것이 좋다.

 

반응형

'Algorithm > BOJ' 카테고리의 다른 글

[백준] solved.ac (in Java)  (0) 2024.10.18
[백준] IOIOI in Java  (0) 2024.10.16
[백준] 1,2,3 더하기 in Java  (3) 2024.07.14
[백준] 2xn 타일링 in Java  (1) 2024.07.13
[백준] 1로 만들기 in Java  (1) 2024.07.13