[붙끝코] 2일차 (백준 10814)

Burpeeeee·2024년 9월 10일
post-thumbnail

아악 붙끝코 2알차이다. 자바로 코테 언어를 제한 해놓는 상당히 있음 + 메인 스텍을 자바 스프링으로 가져가려다보니 자바로 코테 언어를 바꿨는데!!!! 그래도 아직은 코테는 파이썬 훨씬이 편한 것 같다.ㅜ 징징 그만대고 2일차도 가보자고.

오늘의 문제
나이순 정렬

📌 문제 탐색하기

첫번째 입력: 온라인 저지 회원 수 N
두번째 입력 : N명에 해당하는 온라인 저지의 이름과 나이 입력
정렬: 나이순 대로. 나이가 같은 경우 가입순 대로

📌 코드 설계하기

우선 회원수가 10만명까지 가능하므로 이중 반복문 돌리는 것응 어려움.
1. 이차원 배열에 이름,나이 저장 후 나이 순대로 정렬. 정렬 방법은 Arrays.sort()에 Comparator 의 compare 메소드를 구현하여 사용자 정렬을 사용해서 쓸 수 있다.

compare 메소드는
• 나이의 차이가 양수이면 s2가 앞에 와야 하므로 s2를 먼저 놓고,
• 차이가 0이면 순서를 유지하며,
• 차이가 음수이면 s1이 앞에 와야 하므로 s1을 먼저 놓는다.


  1. 1번 성능 개선.
  • Scanner 대신 BufferedReader와 BufferedWriter를 사용.
  • 클래스 이용해서 나이와 이름을 객체로 묶어 처리.
    -->기존에는 Integer.parseInt()를 두번 호출하는 대신,Person 클래스를 사용함으로써 Integer.parseInt() 호출을 한번만한다.

📌 시도 회차 수정 사항

1번 코드에서 이상은 없었지만 속도 저하로 다른 방법을 생각해봄.

📌 정답 코드

1번 코드

import java.util.Arrays;
import java.util.Comparator;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {

        Scanner sc= new Scanner(System.in);
        // 저지 인원 수 받기
        int n = sc.nextInt();
        String [][] arr= new String [n][2];// 이름과 나이 받기
        for(int i=0;i<n; i++){
            arr[i][0]=sc.next(); // 나이
            arr[i][1]=sc.next(); // 이름
        }


       Arrays.sort(arr, new Comparator<String[]>() {
           @Override
           public int compare(String[] o1, String[] o2) {
               return Integer.parseInt(o1[0]) - Integer.parseInt(o2[0]);
           }
       });
        for(int i=0;i<n;i++){
            System.out.println(arr[i][0]+" "+arr[i][1]);
        }

    }
}

2번

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.IOException;
import java.util.Arrays;
import java.util.Comparator;

class Person {
    int age;
    String name;

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

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        
        // 저지 인원 수 받기
        int n = Integer.parseInt(br.readLine());
        Person[] arr = new Person[n];
        
        for (int i = 0; i < n; i++) {
            String[] input = br.readLine().split(" ");
            int age = Integer.parseInt(input[0]);
            String name = input[1];
            arr[i] = new Person(age, name);
        }

        // 나이순으로 정렬
        Arrays.sort(arr, Comparator.comparingInt(p -> p.age));

        
        for (Person p : arr) {
            bw.write(p.age + " " + p.name + "\n");
        }
        
        bw.flush();
        br.close();
        bw.close();
    }
}
profile
? 이 가득하지만 곧 !이 될

0개의 댓글