탭고리즘

탭고리즘 2025-1-28 프로젝트 우선순위 정렬하기

종식당 2025. 1. 28. 15:59
728x90
반응형


  • 문제설명
    첫번째줄에 입력받은 정수 만큼의 프로젝트 정보들을 차례대로 입력받는다. 이 프로젝트 정보에는 이름, 우선순위, 등록시간이 있는데, 이들을 정렬해서 출력하면된다. 순서는 다음과 같다.
    우선순위가 작은 프로젝트 먼저, 우선순위가 같으면 등록시간이 빠른 프로젝트 먼저, 등록시간이 같으면 프로젝트 이름을 사전순으로 정렬
  • 제출코드     
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)));
        int N = Integer.parseInt(br.readLine());

        List<Project> projects = new ArrayList<>();

        for(int i = 0; i < N; i++){
            StringTokenizer st = new StringTokenizer(br.readLine());
            String name = st.nextToken();
            int priority = Integer.parseInt(st.nextToken());
            int time = Integer.parseInt(st.nextToken());

            projects.add(new Project(name, priority, time));
        }

        projects.sort((p1,p2)->{
            if(p1.priority != p2.priority){
                return Integer.compare(p1.priority, p2.priority);
            } else if(p1.time != p2.time){
                return Integer.compare(p1.time, p2.time);
            }else{
                return p1.name.compareTo(p2.name);
            }
        });

        for(Project p : projects){
            System.out.println(p.name+" " + p.priority + " " + p.time);
        }


    }

    static class Project{
        String name;
        int priority;
        int time;

        Project(String name, int priority, int time){
            this.name = name;
            this.priority = priority;
            this.time = time;
        }
    }
}

 

  • 코드설명
    먼저 프로젝트의 정보들을 하나의 객체로 관리하기 위해 Project클래스를 만들어준다. 필드로는 입력받을 프로젝트의 정보인 이름, 우선순위, 시간이 있다.
    정수 N을 입력받고 위에서 만든 Project객체 타입의 List projects를 만들어 for문을 통해 프로젝트의 정보들을 입력받아 List에 넣어준다.
    다음으로는 정렬을 하기 위해 sort메서드와 람다식을 사용했다. 
    먼저 우선순위를 비교해주고 compare를 통해 오름차순으로 정렬했다.
    그 다음 시간을 비교해 오름차순으로 정렬했으며 이름 비교를 통해 사전순으로 정렬을 진행했다.

Integer.compare 동작 원리
Integer.compare(x, y);
  • x가 y보다 작을 때: 음수 반환 (x - y < 0)
  • x가 y와 같을 때: 0 반환 (x - y == 0)
  • x가 y보다 클 때: 양수 반환 (x - y > 0)

즉, 음수가 반환되면 x가 y보다 먼저 정렬되고, 양수가 반환되면 x가 y보다 뒤에 정렬됩니다.
따라서, Integer.compare(p1.age, p2.age)를 사용하면 작은 나이부터 큰 나이로 정렬됩니다.

 

오름차순 정렬: Integer.compare(p1.age, p2.age)

  1. p1.age가 p2.age보다 작으면 음수를 반환하고, 이는 p1이 앞에 오게 만듭니다.
  2. p1.age와 p2.age가 같으면 0을 반환하고, 두 객체의 상대적 순서는 변경되지 않습니다.
  3. p1.age가 p2.age보다 크면 양수를 반환하고, 이는 p2가 앞에 오게 만듭니다.

이 방식으로 작은 값먼저 오게 되며, 이는 오름차순 정렬입니다.

내림차순 정렬: Integer.compare(p2.age, p1.age)

여기서는 p2.age와 p1.age를 비교합니다.

  1. p2.age가 p1.age보다 작으면 양수를 반환하고, 이는 p1이 앞에 오게 만듭니다.
  2. p2.age와 p1.age가 같으면 0을 반환하고, 두 객체의 순서는 변경되지 않습니다.
  3. p2.age가 p1.age보다 크면 음수를 반환하고, 이는 p2가 앞에 오게 만듭니다.

즉, 큰 값먼저 오게 되며, 이는 내림차순 정렬입니다.

728x90
반응형