백준 10814 나이순 정렬[JAVA]

Ga0·2023년 5월 1일
0

baekjoon

목록 보기
41/125

문제 해석

  • 첫째 줄에 온라인 저지 회원 수(N)을 입력받는다.
  • 둘째 줄부터는 입력받은 N만큼 회원의 나이와 이름을 입력받는다.
  • 입력받은 회원 정보를 나이순으로 정렬하되, 나이가 동일할 경우 먼저 등록한 순으로 출력한다.

코드1

import java.io.*;
import java.util.ArrayList;
import java.util.Collections;
import java.util.StringTokenizer;

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));
        StringTokenizer st;

       int N = Integer.parseInt(br.readLine());
       ArrayList<Member> list = new ArrayList<>();

        for(int i = 0; i < N; i++) {
            st = new StringTokenizer(br.readLine());
            //i는 하나씩 증가하므로 인덱스라 할 수 있다.
            list.add(new Member(i, Integer.parseInt(st.nextToken()), st.nextToken()));
        }

        Collections.sort(list); //정렬

        for(int i = 0; i < N; i++) {
            bw.write(list.get(i).toString());
        }

        br.close();

        bw.flush();
        bw.close();

    }
}
//회원 클래스
class Member implements Comparable<Member>{ 
    int index ; // 등록 순서
    int age; //나이
    String name; //이름

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

    @Override
    public int compareTo(Member o) {
        if (this.age != o.age) return this.age - o.age; //만약 나이가 다를 경우는 나이 순으로 정렬하고
        else return this.index - index; //나이가 동일할 경우는 등록 순서대로 출력한다.
    }

    public String toString() {
        return age + " " + name + "\n";
    }
}

결과1

  • 하지만,,, 꽤 시간과 메모리가 많이나와서 다른 사람 코드를 보고 다시 작성해보았다. (아래부터)

코드2

import java.io.*;
import java.util.StringTokenizer;

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

        StringBuilder initMember[] = new StringBuilder[201];//나이는 1이상 200이하이므로 크기를 201까지 지정해준다.

        for(int i = 0; i < 201; i++){
            initMember[i] = new StringBuilder(); //StringBuilder 배열이기 때문에 해당 StringBuilder를 생성해주어야한다.(요소마다)
        }

        for(int i = 0; i < N; i++) {
            StringTokenizer st = new StringTokenizer(br.readLine());
            int age = Integer.parseInt(st.nextToken());
            //출력 형식을 배열에 추가해준다.(같은 나이일 때 이러면 등록된 순서대로 나옴)
            initMember[age].append(age +" "+ st.nextToken() +"\n");
        }

        br.close();

        for (StringBuilder sb : initMember) {
            bw.write(sb.toString());
        }
        
        bw.flush();
        bw.close();


    }
}
  • 처음 문제를 풀때는 클래스를 만들어 풀었다.
  • 하지만, 시간이 너무 많이 나와서 StringBuilder 배열을 사용했는데 해당 나이를 인덱스를 둔다는 생각을 하지 못했기 때문에 신선했다. (차피 값이 없는 값은 출력을 해도 빈값이니까)
  • 이렇게 되면 등록순서 인덱스 값이 필요 없게된다. (순서대로 StringBuilder에 나이 이름 순으로 줄바꿈까지 추가해서 저장하기 때문에

결과2

  • 속도는 확실히 앞보단 줄었지만 여전히 많이 나온다.... 좀 보완해야할 사항인 것 같다.

느낀점

  • 항상 익숙한 형태로만 풀려고 해서 시간이나 메모리 부분을 크게 줄일 수 없는 것 같다...
  • 좀 더 효율적인 방법과 참신한 방법으로 풀기도 해야하는데 그 부분에 있어아직 미숙한 것 같다.

0개의 댓글