문제 풀이/[JAVA_자바] 백준

[JAVA / 자바] 백준 10814번 - 나이순 정렬

Seunghyun_KO 2022. 1. 11. 09:00
728x90
반응형

문제

온라인 저지에 가입한 사람들의 나이와 이름이 가입한 순서대로 주어진다. 이때, 회원들을 나이가 증가하는 순으로, 나이가 같으면 먼저 가입한 사람이 앞에 오는 순서로 정렬하는 프로그램을 작성하시오.


입력

첫째 줄에 온라인 저지 회원의 수 N이 주어진다. (1 ≤ N ≤ 100,000)

둘째 줄부터 N개의 줄에는 각 회원의 나이와 이름이 공백으로 구분되어 주어진다. 나이는 1보다 크거나 같으며, 200보다 작거나 같은 정수이고, 이름은 알파벳 대소문자로 이루어져 있고, 길이가 100보다 작거나 같은 문자열이다. 입력은 가입한 순서로 주어진다.


출력

첫째 줄부터 총 N개의 줄에 걸쳐 온라인 저지 회원을 나이 순, 나이가 같으면 가입한 순으로 한 줄에 한 명씩 나이와 이름을 공백으로 구분해 출력한다.


 


문제 접근 방법

이번 문제는 회원의 나이와 이름이 같은 줄에 입력되어, 나이 기준으로 오름차순 하는 문제인데, 나이가 같으면 가입 순으로 오름차순 하여 출력하는 문제이다.

i)

나이는 1~200까지 입력된다 했는데 범위가 생각보다 작아서 굳이 정렬하지 않고 가입 순으로 배열에 저장해서 나이를 1부터 200까지 오름차순으로 배열을 돌아 앞에서부터 끝까지 현재 나이에 해당하는 가입 정보를 출력하는 것을 반복하면 문제에서 원하는 결과물이 나온다.

ii)

나이를 기준으로 정렬한 후 그대로 출력한다. 이때, 현재 배열은 가입일 순으로 정렬되어있기 때문에 같은 나이는 건드리지 않고 배열 정렬 함수를 이용하여 나이만 비교하여 정렬하여주도록 한다. 그 후 배열 처음부터 끝까지 순서대로 출력해준다.


JAVA 코드 풀이

i) 정렬하지 않고 출력

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

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 num = Integer.parseInt(br.readLine());
        ArrayList<String[]> info = new ArrayList<>();
        for(int i=0; i<num; i++)
            info.add(br.readLine().split(" ")); // 나이와 이름 입력 사이 공백이 있으므로 공백을 기준으로 나누어 문자형 배열로 리스트에 저장한다.
        for(int i=1; i<=200; i++){ // 1살부터 200살까지 가입자의 나이를 대조
            for(int j=0; j<info.size(); j++){
                if(Integer.parseInt(info.get(j)[0]) == i){ 가입자의 나이를 비교해서 현재 찾고있는 나이와 맞으면 출력
                    bw.write(info.get(j)[0]+" "+info.get(j)[1]+"\n");
                    info.remove(j--); // 가입자를 출력했으면 다음 반복때 대조를 해볼 필요가 없으므로 불필요한 코드 실행을 방지하기위해 리스트에서 삭제, 또한 리스트에서 삭제되면 뒤에 있던 값들의 인덱스가 1씩 감소하므로 반복문이 한바퀴 돌아도 j값이 증가하지 않고 그대로이도록 1을 빼준다.
                }
            }
        }
        bw.close();
    }
}

i) 나이순으로 정렬하고 출력

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

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 num = Integer.parseInt(br.readLine());
        ArrayList<String[]> info = new ArrayList<>();
        for(int i=0; i<num; i++)
            info.add(br.readLine().split(" "));
        Collections.sort(info,(a,b)->{				
			return Integer.parseInt(a[0]) - Integer.parseInt(b[0]);
		}); // 가입자들의 정보가 저장된 배열을 나이 오름차순으로 정렬
        for(int j=0; j<info.size(); j++){
            bw.write(info.get(j)[0]+" "+info.get(j)[1]+"\n");
            info.remove(j--);
        }
        bw.close();
    }
}

코드 실행 결과

i) 정렬하지 않고 출력 Ver. 코드 실행 결과
ii) 나이순으로 정렬하고 출력 Ver. 코드 실행 결과


후기

문제에서는 정렬을 하라고 의도한 것 같지만 입력으로 들어오는 나이의 개수가 200개밖에 되지 않아 굳이 정렬을 해 주지 않아도 이미 가입 순으로 저장이 되어있으므로 나이를 대조해서 바로 출력해주면 될 것 같다는 생각이 들어 그렇게 코드를 짜 봤더니 오히려 실행 시간이 단축되었다. 정렬을 하는 더 효율적이 코드가 있을 순 있겠지만, 내가 생각한 논리로는 정렬을 하지 않고 일일이 나이를 대조해가면서 출력해주는 것이 더 코드 실행시간이 짧게 나와서 신기했다. 문제의 조건에 따라 예상했던 결과와 다른 경우가 많은데 이를 구분하기 위해 생각나는 방법으로 모두 다 실행해보고 어떤 경우는 어떻게 푸는 것이 보다 효율적인지 알 수 있는 계기가 되었으면 좋겠다.


문제 원본

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

728x90
반응형