본문 바로가기

백준

[백준/JAVA] 4055번: 파티가 좋아 파티가 좋아

문제 보러가기

 

4055번: 파티가 좋아 파티가 좋아

여러 개의 테스트케이스가 주어진다 각 테스트케이스는 첫 번째 줄에 정수 p가 주어진다. (p ≤ 100) 이 p는 파티의 그 날에 열리는 파티의 수이다. p가 0이면 입력의 끝을 의미한다. 이어지는 p개

www.acmicpc.net

[문제 풀이]

파티는 8:00에 시작해서 24:00에 끝난다.

여기서 8시부터 30분간격으로 파티를 참석할 수 있고, 예외적으로 8:00에 시작해서 8:00에 끝나는 파티는 참석으로 친다.

그렇다면 8시부터 30분간격으로 파티를 참석한 것을 어떻게하면 저장할 수있는지 방법을 제시한다면 각 시간대를 배열로 만든다.

시간대 8:00~8:30 8:30~9:00 9:00~9:30 9:30~10:00 10:00~10:30 10:30~11:00

위와 같이 각 시간대에 해당하는 배열을 만들면 되는데, 파티는 오전 8시부터 오후 12시까지 이기때문에 모든 시간대를 합하면 32개의 시간대로 나눌 수 있다. 이제 시간대를 어떻게 저장할지 알기 때문에 저장을 하면 되는데, 이때 시작 시간과 끝나는 시간이 같은 파티는 참석할 수 있는 파티로서 받아들이면 된다. 그리고 저장을 하기전에 정렬을 해야한다. 정렬을 하는 이유가 있다.

시작 시간 종료 시간
12 14
12 13
12 13

위의 입력을 정렬을 하지 않는 예시로 든다.

만약 12~14시간대가 먼저 나온다면 12:00~12:30를 저장하게 되고 이렇게 되면 12~13은 12:30~13:00시간대 한개만을 가질 수 있기 때문에 참석할 수 있는 파티는 총 2개가 된다. 정답은 3개이다.

그렇기 때문에 정렬을 해야한다.

시작 시간 종료 시간
12 13
12 13
12 14

위는 정렬을 한 입력이다. 12:00~12:30, 12:30~13:00, 13:00~13:30을 참석할 수 있기때문에 정답은 3개이다.

또한 정렬을 할 때 시작시간과 종료시간의 차이가 작은 것부터 오름차순으로 정렬해야 한다.

시간의 차이가 작은 것부터 시간대를 저장해야 더 많은 파티를 참석할 수 있다.

 

[코드]

import java.io.*;
import java.util.Arrays;
import java.util.Comparator;
import java.util.StringTokenizer;

class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringTokenizer st;
        StringBuilder sb = new StringBuilder();
        int count = 1;
        int p = Integer.parseInt(br.readLine());
        while (p != 0) {
            Party[] party = new Party[p];
            int[] time = new int[32]; //시간대
            int answer = 0;
            for (int i = 0; i < p; i++) {
                st = new StringTokenizer(br.readLine());
                party[i] = new Party(Integer.parseInt(st.nextToken()), Integer.parseInt(st.nextToken()));
            }
            Arrays.sort(party, Comparator.comparingInt(o -> (o.end - o.start)));
            for (int i = 0; i < p; i++) {
                int start = party[i].start;
                int end = party[i].end;
                if (start == end) answer++; //시작과 끝이 같다면 참석할 수있는 파티이다.
                for (int j = start; j < end; j++) {
                    if (time[(j - 8) * 2] != 1) {
                        time[(j - 8) * 2] = 1;
                        break;
                    }
                    if (time[(j - 8) * 2 + 1] != 1) {
                        time[(j - 8) * 2 + 1] = 1;
                        break;
                    }
                }
            }
            for (int i = 0; i < time.length; i++) {
                if (time[i] == 1) answer++;
            }
            sb.append("On day ").append(count++).append(" Emma can attend as many as ").append(answer).append(" parties.").append("\n");
            p = Integer.parseInt(br.readLine());
        }
        bw.write(sb.toString());
        bw.close();
    }
}

class Party {
    int start, end;

    Party(int start, int end) {
        this.start = start;
        this.end = end;
    }
}

'백준' 카테고리의 다른 글

[백준/JAVA] 25635번: 자유 이용권  (0) 2023.02.13
[백준/JAVA] 1285번: 동전 뒤집기  (0) 2023.02.13
[백준/JAVA] 3064번: Minesweeper  (0) 2023.02.09
[백준/JAVA] 17615번: 볼 모으기  (0) 2023.02.08
[백준/JAVA] 2212번: 센서  (0) 2023.02.07