ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 백준 10814(JAVA) - 나이순 정렬
    Algorithm 2022. 11. 14. 13:34
    728x90

    10814번: 나이순 정렬 (acmicpc.net)

     

    10814번: 나이순 정렬

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

    www.acmicpc.net

    나이순 정렬 문제이다. 이게 왜 실버 5인지는 잘 모르겠는 문제이다. 꽤나 어렵다고 느꼈고 StringBuilder를 사용해서 거의 억지로 끼워맞춰 푼 문제였다. 

     

    문제는 간단하다. 앞의 나이와 이름을 입력받고, 나이를 비교하여 어린 순서대로 정렬시킨다. 또한, 나이가 같으면 먼저 입력받아진 순서대로 위에 먼저 위치시킨다.

     

    알고리즘

    1. N을 입력받는다.(BufferedReader 사용)

    2. StringBuilder 타입의 arr 배열을 만듦. 크기는 201까지

    3. arr.length 만큼 arr배열에 새로운 StringBuilder 객체를 입력받아 넣는다.

    4. 크기 N만큼 StringTokenizer를 사용하여 나이와 이름을 입력받는다.

    5. arr 배열에 나이와 이름을 원하는 방식으로 append 시켜가면서 입력시켜준다.

    6. StringBuilder s 속에 개선된 for문으로 arr 배열 안의 StringBuilder 객체로 이루어진 나이와 이름 묶음을 sb로 출력시켜준다.

     

    package selftest;
    
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.util.StringTokenizer;
    
    public class Main_10814 {
    
    	public static void main(String[] args) throws NumberFormatException, IOException {
    		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    		int N = Integer.parseInt(br.readLine());
    		
    		StringBuilder[] arr = new StringBuilder[201];
    		
    		for(int i = 0; i < arr.length; i++) {
    			arr[i] = new StringBuilder();    //객체 배열에 StringBuilder 객체 생성
    		}
    		
    		for(int i = 0; i<N; i++) {
    			StringTokenizer st = new StringTokenizer(br.readLine());
    			int num = Integer.parseInt(st.nextToken());
    			String name = st.nextToken();
    			arr[num].append(num).append(' ').append(name + '\n');
    			
    		}
    		StringBuilder sb = new StringBuilder();
    		for(StringBuilder s : arr) {
    			sb.append(s);
    		}	
    		System.out.println(sb.toString());
    	}
    }

     

    이렇게 해결할 수 있었다. 너무 억지로 뭔가 끼워맞춰 푼 느낌이라 구글링을 해 보았다. 구글링을 해보니 comparator라는 것을 override 시켜 문제를 풀어주었다. 그 방식을 소개해 보겠다.

     

    import java.util.Scanner;
    import java.util.Arrays;
    import java.util.Comparator;
     
    public class Main {
    	public static void main(String[] args) {		
     
    		Scanner in = new Scanner(System.in);
    		
    		int N = in.nextInt();
    		String[][] arr = new String[N][2];
    		
     
    		for(int i = 0; i < N; i++) {
    			arr[i][0] = in.next();	// 나이
    			arr[i][1] = in.next();	// 이름
    		}
     
    		
    		Arrays.sort(arr, new Comparator<String[]>() {
    			// 나이순으로 정렬
    			@Override
    			public int compare(String[] s1, String[] s2) {
    				return Integer.parseInt(s1[0]) - Integer.parseInt(s2[0]);
    			}
    			
    		});
    		
    		for(int i = 0; i < N; i++) {
    			System.out.println(arr[i][0] + " " + arr[i][1]);
    		}
            
    		
    	}
     
    }

    이차원 배열 arr 속에 나이와 이름을 인덱스로 받고 Arrays.sort로 정렬을 시켜준다. 이 때 new Comparator<String[]>()으로 객체화 시켜주고 compare을 override 시켜 String 타입의 s1, s2를 서로 비교한다. Compare 메소드는 양의 정수, 0, 음의 정수 중 하나를 반환하며, 양의 정수일 경우만 두 객체의 위치를 바꿔주는 역할을 한다.

     

    이렇게 comparator를 사용하여 비교를 하는 새로운 방법을 익힐 수 있었다. 

    728x90

    'Algorithm' 카테고리의 다른 글

    백준 2810(JAVA) - 컵홀더  (0) 2022.11.17
    백준 2512(JAVA) - 예산  (0) 2022.11.15
    백준 4673(JAVA) - 셀프 넘버  (0) 2022.11.14
    백준 1789(JAVA) - 수들의 합  (0) 2022.11.10
    백준 14659 - 한조서열정리하고옴ㅋㅋ(JAVA)  (0) 2022.10.05
Designed by Tistory.