인프런 - 결혼식

Hamburgerkin9·2023년 3월 24일

문제

풀이

package Inflearn.greedy.wedding;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        List<Time> timeList = new ArrayList<>();

        for (int i = 0; i < n; i++) {
            int startTime = sc.nextInt();
            int endTime = sc.nextInt();

            timeList.add(new Time(startTime, 's'));
            timeList.add(new Time(endTime, 'e'));
        }
        System.out.println(new Main().solution(timeList));
    }

    public int solution(List<Time> timeList) {
        int maxPeople = 0;
        int peopleCount = 0;
        Collections.sort(timeList);
        for (Time time : timeList) {
            if (time.getState() == 's') {
                peopleCount++;
                maxPeople = Math.max(peopleCount, maxPeople);
            }
            if (time.getState() == 'e') {
                peopleCount--;
            }
        }
        return maxPeople;
    }

}

class Time implements Comparable<Time> {

    private int time;
    private char state;

    public char getState() {
        return state;
    }

    Time(int time, char state) {
        this.time = time;
        this.state = state;
    }

    public int compareTo(Time time) {

        if (this.time == time.time) {
            return this.state - time.state;
        }
        return this.time - time.time;
    }
}

처음엔 배열로 시간에 맞는 index에 값을 넣어줘서 그 중 가장 큰 값을 구하였다.
아마 입력값이 많아지면 for문이 많이 사용되어 프로그램 실행시간이 길어졌을 것 이다.

이전 그리디 문제와 비슷하게 정렬을 이용하는 문제였다. 조금 다른점은 시작시간과 끝난시간을 구분을 위한
char state였다. 시작 시간에는 's'를 같이 끝난 시간에는 'e'로 상태를 표시하였고, 상태를 확인하여 peoplw count의 값을 더해주고 빼주었다.

이 문제에 핵심은 같은 시간에 시작 시간과 끝난 시간이 겹치는 경우였는데 's'와 'e'도 정렬을 통해서
'e'가 무조건 먼저 정렬되게 중요하였다. 그리디 알고리즘은 시간을 더 투자해서 감을 잡는게 중요할 것 같다.

profile
개발자

0개의 댓글