알고리즘/백준

코딩공부 62일차: 백준 10814번 나이순 정렬 자바 Java

김발자~ 2022. 9. 30. 16:06
반응형

백준 9단계 10번 문제 - 10814 나이순 정렬

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

 

10814번: 나이순 정렬

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

www.acmicpc.net

 

 

 


9. 정렬 (10) 백준 10814번 문제 나이순 정렬


문제


 

 

 

 

 


과정 생각해보기


 

문제에 들어가기 전에 백준에서 안정 정렬을 사용해야 한다고 알려주고 있는데,

찾아보니 merge라는 게 필요한 듯보였다

 

그래서 일단 merge 개념을 찾아보기 전에 내가 할 수 있는 선에서 해보기로 했다

 

생각해낸 방법은 2차원 배열을 이용하는 거였다

 

 

 


오답


 

빈 정수 tmp를 만들어서 숫자 크기에 따라 인덱스 i와 j의 위치를 바꿔주려고 했는데

그러면 i가 다시 돌아갈 때에 바뀐 값이 들어가 인정되지 않는 값이므로 원하는 대로 출력되지 않았다

comparator도 구현하는 데 애를 먹었다

 

 

 


정답 인정 코드


 

https://st-lab.tistory.com/113

이 블로그를 참고했다

많은 방법이 적혀있지만 우선 내가 생각했던 2차원 배열부터 쳐봤다

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
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[]>() {
            public int compare(String[] s1, String[] s2) {
// 여기까진 작성
                return Integer.parseInt(s1[0]) - Integer.parseInt(s2[0]);
                        //양수면 왼쪽이 큰 순서로, 음수면 오른쪽이 큰 순서로 위치를 바꾸고 0이면 그대로
            }
            
        });
        
        for(int i = 0; i < n; i++) {
        System.out.println(arr[i][0+ " " + arr[i][1]);
        }
    }
 
}
cs

 

나이가 같으면 아이디 순서는 입력된 순서 그 자체이므로

if 조건을 주지 않고 바로 뺄셈으로 갔다는 게 처음 본 형식이었다

 

 

 


직후 백지 복습


 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.Comparator;
import java.util.StringTokenizer;
 
public class Main {
 
    public static void main(String[] args) throws IOException{
        BufferedReader  br = new BufferedReader(new InputStreamReader(System.in));
        
        int n = Integer.parseInt(br.readLine());
        Person arr[] = new Person[n];
        
        for(int i = 0; i < n; i++) {
            StringTokenizer st = new StringTokenizer(br.readLine(), " ");    //br은 한 줄씩만 인식해서
            int age = Integer.parseInt(st.nextToken());
            String name = st.nextToken();
            arr[i] = new Person(age, name);
        }
        
        Arrays.sort(arr, new Comparator<Person>() {
            public int compare(Person s1, Person s2) {
                return s1.age - s2.age;
            }
        });
        
        StringBuilder sb = new StringBuilder();
        for(int i = 0; i < n; i++) {
           sb.append(arr[i]); //Arraays.toString(arr) 쓰면 원하는 형식으로 나오지 않아 아래 클래스에서 오버라이딩
        }
        System.out.println(sb);
    }
 
}
 
class Person{
    int age;
    String name;
    
    Person(int age, String name) {
        this.age = age;
        this.name = name;
    }
    
    public String toString() {
        return age + " " + name + "\n";
    }
}
cs

 

클래스를 만들어서 직접 사용해볼 수 있는 예제는 처음이라

위에 첨부한 링크의 블로그에서 person 클래스를 만드는 방식을 쳐봤다

 

 

 


많이 틀리긴 했지만 와닿지 않던 직접 개념을 적용해보고 알고리즘까지 볼 수 있는 기회라 좋았다

올린 코드들 외에도 방법들이 특히 많아서 여러 번 보면 좋을 것 같다

반응형