[JAVA][Baekjoon] 1931번 회의실 배정 🌟🌟🌟

2025. 1. 8. 09:25·Coding Test/Baekjoon
728x90
반응형

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


📌 접근 방식

1️⃣ 회의실에 최대한 많은 회의를 배정하려면 어떤 기준을 세워야 할까?

  • 회의가 겹치지 않게 하려면 현재 회의가 끝난 후에 다음 회의가 시작해야 함
  • 따라서, 회의를 배정할 때 현재 시점에서 가장 빨리 끝나는 회의를 선택하면 다음 회의를 시작할 가능성이 높아짐
    → 이를 위해 회의 종료 시간을 기준으로 오름차순 정렬

2️⃣ 정렬 기준을 어떻게 설정해야 할까?

  • 기본 정렬 기준: 회의의 종료 시간이 빠른 순서
    → 종료 시간이 빠르면 이후 회의를 배정할 가능성이 높아지기 때문
  • 보조 정렬 기준: 종료 시간이 같다면 시작 시간이 빠른 순서
    → 종료 시간이 같은 회의 중에서도 시작 시간이 빠른 회의를 먼저 배정하면 겹치지 않는 회의의 개수를 최대화할 수 있음

3️⃣ 회의를 배정하는 방법은?

  • 정렬된 회의 리스트를 순회하며, 현재 회의의 시작 시간이 이전 회의의 종료 시간보다 크거나 같을 때만 그 회의를 배정
    ➡️ 이렇게 하면 회의가 겹치는 경우를 방지할 수 있습니다.
  • 회의를 배정할 때마다 종료 시간을 업데이트하고, 회의의 개수를 카운트

✅ PASS CODE

import java.io.*;
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));
        StringTokenizer st = new StringTokenizer(br.readLine());
        
        int N = Integer.parseInt(st.nextToken());
        int[][] A = new int[N][2]; 

        for (int i = 0; i < N; i++) {
            st = new StringTokenizer(br.readLine());
            A[i][0] = Integer.parseInt(st.nextToken());  // 시작 시간
            A[i][1] = Integer.parseInt(st.nextToken());  // 종료 시간
        }

        // 종료 시간을 기준으로 오름차순 정렬 (같은 경우 시작 시간을 기준으로 정렬)
        Arrays.sort(A, new Comparator<int[]>() {
            @Override
            public int compare(int[] S, int[] E) {
                if (S[1] == E[1]) {  // 종료 시간이 같으면
                    return S[0] - E[0];  // 시작 시간을 기준으로 오름차순 정렬
                }
                return S[1] - E[1];  // 종료 시간을 기준으로 오름차순 정렬
            }
        });

        // 그리디 알고리즘으로 회의 배정
        int count = 0;  // 최대 배정할 수 있는 회의 수
        int end = -1;   // 이전 회의의 종료 시간 (초기값: -1)

        for (int i = 0; i < N; i++) {
            if (A[i][0] >= end) {  // 현재 회의의 시작 시간이 이전 회의의 종료 시간 이후라면
                end = A[i][1];     // 종료 시간을 업데이트
                count++;           // 회의 배정
            }
        }

        System.out.println(count);
    }
}

 


반응형

😊 느낀 점

처음에는 단순히 시작 시간이 빠른 순서로 정렬하면 된다고 생각했다. 하지만 이는 최적의 해를 보장하지 못할 수 있다고 생각되었다. 종료 시간을 기준으로 정렬해야 다음 회의를 더 효율적으로 배정할 수 있다는 것을 깨달았다! 또한, 종료 시간이 같은 경우에는 시작 시간이 빠른 순서로 정렬해야 했기 때문에 정렬 조건을 설정하는 데 조금 어려웠다.

이번 문제를 통해 정렬 기준 설정의 중요성과 그리디 알고리즘의 핵심 원리를 다시 한 번 느낄 수 있었다. 😊

 
 
 
728x90
반응형
저작자표시 비영리 변경금지 (새창열림)

'Coding Test > Baekjoon' 카테고리의 다른 글

[JAVA][Baekjoon] 1929번 소수 구하기 🌟🌟🌟  (1) 2025.01.09
[JAVA][Baekjoon] 1541번 잃어버린 괄호 🌟🌟🌟  (1) 2025.01.08
[JAVA][Baekjoon] 1744번 수 묶기 🌟🌟🌟  (0) 2025.01.07
[JAVA][Baekjoon] 1715번 카드 정렬하기🌟🌟  (1) 2025.01.07
[JAVA][Baekjoon] 11047번 동전 0  (0) 2025.01.07
'Coding Test/Baekjoon' 카테고리의 다른 글
  • [JAVA][Baekjoon] 1929번 소수 구하기 🌟🌟🌟
  • [JAVA][Baekjoon] 1541번 잃어버린 괄호 🌟🌟🌟
  • [JAVA][Baekjoon] 1744번 수 묶기 🌟🌟🌟
  • [JAVA][Baekjoon] 1715번 카드 정렬하기🌟🌟
예롱메롱
예롱메롱
  • 예롱메롱
    예롱이의 개발 블로그
    예롱메롱
  • 전체
    오늘
    어제
    • 전체보기 (274)
      • 프로젝트 (35)
        • Wedle (12)
        • 인스타그램 클론 코딩 (13)
        • 스프링 부트와 AWS로 혼자 구현하는 웹 서비스 (10)
      • 인프런 Spring 강의 정리 (79)
        • 스프링 입문 - 코드로 배우는 스프링 부트, 웹 .. (7)
        • Spring 핵심 원리 - 기본편 (9)
        • 모든 개발자를 위한 HTTP 웹 기본 지식 (8)
        • 자바 ORM 표준 JPA 프로그래밍 - 기본편 (11)
        • 실전! 스프링 부트와 JPA 활용1 - 웹 애플리.. (6)
        • 실전! 스프링 부트와 JPA 활용2 - API 개.. (5)
        • 실전! 스프링 데이터 JPA (7)
        • 스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술 (7)
        • 스프링 MVC 2편 - 백엔드 웹 개발 활용 기술 (11)
        • 실전! Querydsl (8)
      • Cloud (3)
      • Spring (6)
        • spring boot (5)
        • 소셜로그인 (1)
      • Docker (2)
      • DevOps (0)
      • Coding Test (114)
        • Programmers (37)
        • Baekjoon (76)
      • KB It's Your Life 6기 (1)
      • CS (18)
        • 알고리즘 (13)
        • 컴퓨터 구조 (1)
        • Operating System (0)
        • Network (0)
        • Database (4)
      • git (1)
      • Language (15)
        • Java (5)
        • C++ (6)
        • Python (4)
    • GITHUB GITHUB
    • INSTAGRAM INSTAGRAM
  • hELLO· Designed By정상우.v4.10.3
예롱메롱
[JAVA][Baekjoon] 1931번 회의실 배정 🌟🌟🌟
상단으로

티스토리툴바