반응형
Notice
Recent Posts
Recent Comments
Link
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Archives
Today
Total
11-07 11:40
관리 메뉴

ImJay

[SWEA/Java] 4408. 자기 방으로 돌아가기 본문

SW Expert Academy/D4

[SWEA/Java] 4408. 자기 방으로 돌아가기

ImJay 2024. 1. 29. 23:26
반응형

[SWEA/Java] 4408. 자기 방으로 돌아가기

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com


해설

풀이

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.StringTokenizer;

public class Solution {
    public static void main(String[] args) throws NumberFormatException, IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();

        int testCase = Integer.parseInt(br.readLine());

        // 테스트 케이스 수만큼 반복
        for (int t = 1; t <= testCase; t++) {
            int n = Integer.parseInt(br.readLine()); // 돌아가야 할 학생 수
            ArrayList<ArrayList<Integer>> array = new ArrayList<>();

            // 학생들의 현재 방과 돌아가야 할 방 입력 받기
            for (int i = 0; i < n; i++) {
                String input = br.readLine();
                StringTokenizer st = new StringTokenizer(input);

                int s = Integer.parseInt(st.nextToken()); // 현재 방 번호
                int e = Integer.parseInt(st.nextToken()); // 돌아가야 할 방 번호

                // 방 번호가 큰 것을 뒤로 정렬하기 위해 조정
                if (s > e) {
                    int tmp = s;
                    s = e;
                    e = tmp;
                }

                // 배열 인덱스 계산을 위해 2로 나누고 인덱스 조정
                int si, ei;
                if (s % 2 == 0) {
                    si = s / 2 - 1;
                } else {
                    si = s / 2;
                }
                if (e % 2 == 0) {
                    ei = e / 2 - 1;
                } else {
                    ei = e / 2;
                }

                // 현재 방과 돌아가야 할 방의 인덱스를 리스트에 추가
                ArrayList<Integer> list = new ArrayList<>();
                list.add(si);
                list.add(ei);
                array.add(list);
            }

            // 현재 방의 인덱스를 기준으로 정렬
            Collections.sort(array, Comparator.comparing(list -> list.get(0)));

            int hour = 0;
            // 모든 학생이 자신의 방으로 돌아갈 때까지 반복
            while (!array.isEmpty()) {
                boolean[] arr = new boolean[200]; // 방이 사용 중인지 여부를 저장하는 배열
                for (int k = 0; k < array.size(); k++) {
                    ArrayList<Integer> list = array.get(k);
                    boolean status = true;
                    // 현재 학생의 방부터 돌아가야 할 방까지의 구간을 확인하여 사용 중인지 체크
                    for (int i = list.get(0); i <= list.get(1); i++) {
                        if (arr[i]) {
                            status = false;
                            break;
                        }
                    }
                    // 사용 중이 아니면 해당 구간을 사용 중으로 변경하고 리스트에서 제거
                    if (status) {
                        for (int j = list.get(0); j <= list.get(1); j++) {
                            arr[j] = true;
                        }
                        array.remove(k);
                        k--;
                    }
                }
                hour++; // 한 시간 경과
            }
            // 결과 문자열에 결과 추가
            sb.append("#" + t + " " + hour + "\n");
        }
        // 결과 출력
        System.out.print(sb);
    }
}
반응형
Comments