백준문제(1931)

·2025년 4월 22일

알고리즘문제

목록 보기
1/4


백준문제1931

풀이

  1. 겹치지않는 가장 많은 회의의 갯수를 구하기 위해 우선 끝나는 시간을 기준으로 오름차순으로 정렬을 하였다
  2. 문제의 회의의 시작시간이 끝나는 시간이 같을 수 있다는점이 있어 만약 끝나는 시간이 같을경우 시작시간을 오름차순으로 정렬하였다
  3. 종료시간을 -1 카운트를 0 변수로 선언
  4. 배열전체를 반복문과 조건문을 통해 검사
  5. 만약 시작시간이 종료시간보다 같거나 크다면 카운트를증감 종료시간을 대입하여서 문제풀이를하였다

트러블슈팅

문제1. 백준 런타임에러

문제 : 내 코드를 그대로 복사 붙여넣기해서 제출하였더니 백준의 런타임에러가 발생했다 런타임 에러
런타임 에러 (main class Main)
해결 : IDE에서 코드를 써서 상단에 package를 제출때 지우지 않아서 생겼던일

문제2. 끝나는시간을 기준으로 오름차순하여 정렬하였으나 정답이아님

문제 : 회의의 시작 시간이 이전 회의의 종료 시간과 같을 수 있다는 점을 고려하지 않으면 종료 시간이 동일한 회의들 중에서 시작 시간이 종료 시간과 같은 회의가 먼저 정렬될 경우 최적의 회의 선택 과정이 달라져서 결과 개수가 틀려질 수 있다.
해결 : 종료시간이 같을경우 시작시간을 오름차순으로 정렬

문제예시
(3, 3),(1, 3), (3,4)
일 경우 (1,3) -> (3, 3) -> (3, 4)로 3개지만 만약 (3, 3)이 먼저 온다면 회의 갯수가 2개가 된다.

// 수정 전
Arrays.sort(arr, (a, b)-> a[1]-b[1]);
// 수정 후
Arrays.sort(arr, (a, b)-> a[1]!= b[1]? a[1]-b[1] : a[0]-b[0]);

내 코드

package problem.p1931;

import java.util.Arrays;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();

        int[][] arr = new int[n][2];
        for(int i = 0; i<n; i++){
            for(int j=0;j<2;j++){
                arr[i][j] = sc.nextInt();
            }
        }
        Arrays.sort(arr, (a, b)-> a[1]!= b[1]? a[1]-b[1] : a[0]-b[0]);
        int count = 0;
        int endTime = -1;
        for(int[] a : arr){
            if(a[0]>= endTime){
                endTime = a[1];
                count++;
            }
        }
        System.out.println(count);
    }
}
profile
진입니다.

0개의 댓글