[백준 자바] 26265번 멘토와 멘티

2023. 12. 26. 19:55
728x90

 

정렬 문제여서 간단하게 생각했다. 간단하게 Arrays.sort()를 쓰면 되지 않을까 하고 풀어보았다.

 

고민했던 점은

1) 멘토-멘티 순서쌍을 어떤 식으로 표현할지

2) 비교를 어떤 방법으로 표현할지

였다.

 

첫번째 풀이는

1) String[][] 2차원 배열에 저장하는 것이었다. 

2) 비교는 Arrays.sort(람다식) 사용.

 

>> 코드는 이런식으로 나왔다. 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;

// 멘토와 멘티 실버5
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());

        // N = 멘토-멘티 순서쌍의 수
        // 목록의 정렬을 맡겼다.
        // 멘토를 기준으로 사전 순으로 정렬하되,
        // 멘토가 같은 순서쌍들에 대해선 멘티의 사전 역순으로 정렬한다.
        // 앞 멘토, 뒤 멘티

        String[][] pairs = new String[N][2];

        for(int i=0; i<N; i++) {
            String[] inputString = br.readLine().split(" ");
            pairs[i][0] = inputString[0]; //x,0에는 멘토이름 저장
            pairs[i][1] = inputString[1]; //x,1에는 멘티이름 저장
        }

        Arrays.sort(pairs, (o1, o2) -> { //정렬 람다 표현식 
        // o1[0], o2[0]은 멘토이름, o1[1], o2[1]은 멘티이름
            if (o1[0].compareTo(o2[0])==0) { // 멘토이름이 같으면
                return o2[1].compareTo(o1[1]); // 멘티이름 내림차순 정렬
            } else { // 같지않으면
                return o1[0].compareTo(o2[0]); // 멘토이름 오름차순 정렬
            }
        });
        
        // 정렬 결과 출력
        StringBuffer sb = new StringBuffer();
        for(int i=0; i<N; i++) {
            sb.append(pairs[i][0]).append(" ").append(pairs[i][1]).append("\n");
        }
        System.out.println(sb);

    }
}

 

그런데 생각보다 시간과 메모리가 많이 차지했다...! 오호...

아주 조금이라도 줄여보자 하고 다른 방법을 선택했다. 

 

두번째 풀이

1) 따로 클래스로 빼서 객체로 저장하기

2) Arrays.sort(람다식) 활용

 

코드는 거의 비슷했다... 

시간과 메모리는 오히려 더 늘어난 것을 볼 수  있었다...

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;

// 멘토와 멘티 실버5
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());

        Pairs[] pairs = new Pairs[N]; //Pairs 객체를 담는 배열 생성
        for(int i=0; i<N;i++) {
            String[] inputString = br.readLine().split(" ");
            Pairs newPair = new Pairs(inputString[0],inputString[1]); //여기서 Pairs 객체 생성 후
            pairs[i] = newPair; // 그것을 배열에 저장
        }

        Arrays.sort(pairs, (o1, o2) -> { // Pairs 객체가 있는 배열 내의 mentor, mentee 비교 후 정렬
            if (o1.mentor.equals(o2.mentor)) {
                return o2.mentee.compareTo(o1.mentee);
            } else {
                return o1.mentor.compareTo(o2.mentor);
            }
        });

        StringBuffer sb = new StringBuffer();
        for(int i=0; i<pairs.length; i++) {
            sb.append(pairs[i][0]).append(" ").append(pairs[i][1]).append("\n");
        }
        System.out.println(sb);
    }
    
    // 클래스 생성
    public static class Pairs {
        private String mentor;
        private String mentee;

        public Pairs(String mentor, String mentee) {
            this.mentor = mentor;
            this.mentee = mentee;
        }
    }
}

 

 

마지막 풀이

1) 클래스로 만들어 객체 생성

2) Comparator 상속으로 클래스 내에 compare 메서드 오버라이딩 후 메인에서 Collections.sort()로 비교/정렬

 

Comparator상속이 낯설어서 조금 헤맸다. 그리고 그것을 써먹을 때 Collections.sort() 메서드를 사용하는 것을 몰랐다. 

Collections 클래스의 sort 메서드 설명이다. 

파라미터로는 List<T> list와 Comparator<? super T> c이다. 

- list : the list to be sorted 정렬될 리스트

- c : the comparator to determine the order of the list. 그 리스트의 순서를 결정할 대상..(?) 그런 것..

 

코드는 이렇게 나왔다. 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;

// 멘토와 멘티 실버5
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());

        List<Pairs> pairs = new ArrayList<>(); // Pairs객체를 ArrayList로 저장.
        for(int i=0; i<N;i++) {
            String[] inputString = br.readLine().split(" ");
            pairs.add(new Pairs(inputString[0], inputString[1])); // Pairs객체 생성과 동시에 리스트에 담기
        }

        Collections.sort(pairs, new Pairs()); // sort메서드(list, c) 비교대상은 new Pairs() 이것 때문에 기본생성자가 필요함.


        StringBuffer sb = new StringBuffer();
        for(int i=0; i<pairs.size(); i++) {
            sb.append(pairs.get(i).mentor).append(" ").append(pairs.get(i).mentee).append("\n");
        }
        System.out.println(sb);
    }
    
    public static class Pairs implements Comparator<Pairs> { //Comparator<Pairs>를 상속받는 Pairs 클래스 생성
        private String mentor;
        private String mentee;

        public Pairs() { //기본생성자 (인자가 없는)
        }

        public Pairs(String mentor, String mentee) {
            this.mentor = mentor;
            this.mentee = mentee;
        }

        @Override
        public int compare(Pairs o1, Pairs o2) { //Comparator 객체의 compare 메서드 오버라이딩
            if (o1.mentor.equals(o2.mentor)) { //멘토이름 같을시 멘티이름으로 내림차순 정렬
                return o2.mentee.compareTo(o1.mentee);
            } else { //멘토이름 다를시 멘토이름으로 오름차순 정렬
                return o1.mentor.compareTo(o2.mentor);
            }
        }
    }
}

 

 

결과는 역순으로 보면 된다. 가장 위의 것이 세번째 풀이임. 이것 외에도 다양한 방법들이 있을 것 같다....

 

Collections.sort() 활용하는 방법도 여러 가지 풀어보아야겠다.

728x90

BELATED ARTICLES

more