Algorithm/๊ทธ๋ฆฌ๋””(Greedy)

[๋ฐฑ์ค€, Java] 5186๋ฒˆ : ํŒŒํ‹ฐ๋ฅผ ์—ด์–ด๋ผ!!!

Zayson 2022. 7. 6. 23:35

๐Ÿ”— ๋ฌธ์ œ ๋งํฌ

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

๐Ÿ˜ฎ ๋ฌธ์ œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

์ตœ๋Œ€ํ•œ ๋งŽ์€ ์ฐจ๋ฅผ ์ด์šฉํ•ด ์ตœ๋Œ€ํ•œ ๋งŽ์€ ์นœ๊ตฌ๋“ค์„ ์ง‘์— ๋ณด๋‚ด์ค˜์•ผ ์ตœ์†Œํ•œ์œผ๋กœ ์ง‘์—์„œ ์žฌ์šธ ์ˆ˜ ์žˆ๋‹ค.

 

์ตœ๋Œ€ํ•œ ๋งŽ์€ ์นœ๊ตฌ๋“ค์„ ๋ณด๋‚ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— “์ฐจ์˜ ์ขŒ์„์ˆ˜๊ฐ€ ๋งŽ์€ ์ˆœ์œผ๋กœ ๋‚ด๋ฆผ์ฐจ์ˆœ" ์ •๋ ฌ์„ ํ–ˆ๋‹ค.

๋˜ํ•œ, ์šด์ „ํ•  ์ˆ˜ ์žˆ๋Š” ์นœ๊ตฌ๋“ค์„ ๋จผ์ € ๋ฐฐ์น˜ํ•ด์ฃผ๊ธฐ ์œ„ํ•ด์„œ ์ˆ ์„ ๋งˆ์‹œ์ง€ ์•Š์€ (S)๊ธฐ์ค€์œผ๋กœ ์ •๋ ฌํ–ˆ๋‹ค.

 

์ž๋™์ฐจ์˜ ๊ฒฝ์šฐ ์šฐ์„ ์ˆœ์œ„ ํ๋ฅผ ์ด์šฉํ•ด ํ•˜๋‚˜์”ฉ ๋นผ๋ฉด์„œ ํƒœ์šธ ์ˆ˜ ์žˆ๋Š” ์šด์ „์ž๋ฅผ ๋ฐฐ์น˜ํ•œ๋‹ค. ๋ฐฐ์น˜๋œ ์šด์ „์ž๋Š” ์ฐจ์— ํƒ”๋‹ค๋Š” ์ฒดํฌ(ride)๋ฅผ ํ•ด์ฃผ๊ณ  ์šด์ „์ž ์ธ์›์ˆ˜๋ฅผ 1 ์ฆ๊ฐ€์‹œํ‚จ๋‹ค.

์šด์ „์ž๊ฐ€ ๋ฐฐ์น˜๋˜๋Š” ๊ฒฝ์šฐ “ํƒœ์šธ ์ˆ˜ ์žˆ๋Š” ์ขŒ์„ - 1 (์šด์ „์ž)”๋ฅผ ์ง€์—ญ๋ณ„ ํƒœ์šธ ์ˆ˜ ์žˆ๋Š” ์ธ์›์ˆ˜ ๋ฐฐ์—ด(avilable)์— ์ €์žฅํ•œ๋‹ค.

 

์ตœ๋Œ€ํ•œ ๋งŽ์€ ์šด์ „์ž๋ฅผ ๋ฐฐ์น˜ํ–ˆ๋‹ค๋ฉด, ์ด์ œ ์นœ๊ตฌ๋“ค ์ธ์›๋งŒํผ ๋ฐ˜๋ณตํ•˜๋ฉด์„œ ์•„์ง ์ฐจ์— ํƒ€์ง€ ์•Š์€ ์• ๋“ค์˜ ๋ชฉ์ ์ง€์™€ ๋™์ผํ•œ ์ง€์—ญ์˜ ์ฐจ์˜ ์ขŒ์„์ด ๋‚จ์•„์žˆ๋‹ค๋ฉด ๋„ฃ์–ด์ฃผ๊ณ , ์•„๋‹Œ ๊ฒฝ์šฐ ์นด์šดํŒ…ํ•ด์ค€๋‹ค.

 

์•„์ง ์ฐจ์— ํƒ€์ง€ ์•Š์€ ๊ฒฝ์šฐ์—๋งŒ ์• ๋“ค์„ ํƒœ์šฐ๋Š” ์กฐ๊ฑด์œผ๋กœ ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์šด์ „์ž๋“ค๋„ ํ•จ๊ป˜ ์นด์šดํŒ…์ด๋œ๋‹ค.

์ด ๋•Œ, ์šด์ „์ž๋ฅผ ๋ฐฐ์น˜ํ•˜๋ฉด์„œ ์นด์šดํŒ…ํ•œ ์šด์ „์ž ์ธ์›์ˆ˜๋ฅผ ๋นผ์ค€๋‹ค.

 

  1. ์นœ๊ตฌ๋“ค ๋ฆฌ์ŠคํŠธ๋ฅผ ์ž…๋ ฅ๋ฐ›์œผ๋ฉด์„œ ์ˆ ์— ์•ˆ์ทจํ•œ ์นœ๊ตฌ๋“ค์„ ์นด์šดํŒ…ํ•œ๋‹ค.
  2. ์ž๋™์ฐจ ๋ฆฌ์ŠคํŠธ์™€ ์นœ๊ตฌ๋“ค ๋ฆฌ์ŠคํŠธ๋Š” ๊ฐ๊ฐ “์ž๋™์ฐจ์˜ ์ขŒ์„ ๋‚ด๋ฆผ์ฐจ์ˆœ”, “์ˆ ์— ์•ˆ์ทจํ•œ ์นœ๊ตฌ๋“ค"๋กœ ์ •๋ ฌํ•œ๋‹ค.
  3. ์ž๋™์ฐจ๋ฅผ ํ์—์„œ ํ•˜๋‚˜์”ฉ ๋นผ๋ฉด์„œ ์šด์ „์ž๋ฅผ ํƒœ์šธ ์ˆ˜ ์žˆ๋Š”์ง€ ํŒ๋‹จํ•˜๊ณ , ํƒœ์šธ ์ˆ˜ ์žˆ๋‹ค๋ฉด ์šด์ „์ž๊ฐ€ ํƒ”๋‹ค๋Š” ํ‘œ์‹œ๋ฅผ ํ•˜๊ณ  ์šด์ „์ž๋ฅผ ์ œ์™ธํ•œ ๋‚จ์€ ์ขŒ์„์„ ๋ฐฐ์—ด์— ์ฆ๊ฐ€์‹œํ‚จ๋‹ค. ์ด ๋•Œ, ์šด์ „์ž์˜ ์ˆ˜๋„ ์นด์šดํŒ…ํ•œ๋‹ค.
  4. ์นœ๊ตฌ๋“ค ์ธ์›๋งŒํผ ๋ฐ˜๋ณตํ•˜๋ฉด์„œ ์ฐจ์— ํƒ€์ง€ ์•Š์€ ์นœ๊ตฌ๋“ค์„ ๋ชฉ์ ์ง€์™€ ๋™์ผํ•œ ์ฐจ์— ์ขŒ์„์ด ๋‚จ์•„์žˆ๋‹ค๋ฉด ํƒœ์šด๋‹ค.
  5. ์ด๋ฏธ ์ฐจ์— ํƒ”๊ฑฐ๋‚˜, ํƒˆ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ ์นด์šดํŒ…์„ ํ•œ๋‹ค.
  6. ์ด๋ฏธ ์ฐจ์— ํƒ„ ๊ฒฝ์šฐ๋„ ํ•จ๊ป˜ ์นด์šดํŒ…๋˜๊ธฐ ๋•Œ๋ฌธ์— ์šด์ „์ž๋“ค์˜ ์ธ์›์ˆ˜ ๋งŒํผ ๋นผ์ค€๋‹ค. (์šด์ „์ž๋Š” ์ฐจ์— ํƒ”์ง€๋งŒ ์นด์šดํŒ…์— ํฌํ•จ๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.)

๐Ÿšฉ Java ์ฝ”๋“œ

package com.second.algorithm.baekjoon;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;

public class Main_5186_ํŒŒํ‹ฐ๋ฅผ_์—ด์–ด๋ผ {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        int K = Integer.parseInt(br.readLine()); // ํ…Œ์ŠคํŠธ์ผ€์ด์Šค

        for (int cases = 1; cases <= K; cases++) {
            StringTokenizer st = new StringTokenizer(br.readLine());
            int N = Integer.parseInt(st.nextToken());   // ์‚ฌ๋žŒ์ˆ˜
            int C = Integer.parseInt(st.nextToken());   // ์ž๋™์ฐจ ์ˆ˜
            int L = Integer.parseInt(st.nextToken());   // ์ง€์—ญ ์ˆ˜

            List<Friend> friends = new ArrayList<>();
            int driver = 0;
            for (int count = 0; count < N; count++) {
                st = new StringTokenizer(br.readLine());
                int location = Integer.parseInt(st.nextToken());
                String drunk = st.nextToken();

                // ์šด์ „ํ•  ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€ ์ธ์›์„ ๊ตฌํ•ด๋†“๋Š”๋‹ค.
                if(drunk.equals("S")) driver++;

                friends.add(new Friend(location, drunk));
            }

            List<Car> cars = new ArrayList<>();
            for (int count = 0; count < C; count++) {
                st = new StringTokenizer(br.readLine());
                int location = Integer.parseInt(st.nextToken());
                int available = Integer.parseInt(st.nextToken());

                cars.add(new Car(location, available));
            }

            int sleepPeople = sleepPeople(N, C, L, friends, cars, driver);
            System.out.println("Data Set "+cases +":");
            System.out.println(sleepPeople);
        }

        br.close();
    }

    private static int sleepPeople(int N, int C, int L, List<Friend> friends, List<Car> cars, int driver) {
        // ์ฐจ๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ
        if(C == 0) return N;

        PriorityQueue<Car> carQueue = new PriorityQueue<>(cars);
        Collections.sort(friends);

        int[] available = new int[L+1];     // ์ฐจ์— ํƒœ์šธ ์ˆ˜ ์žˆ๋Š” ์ธ์› ๋ฐฐ์—ด
        boolean[] ride = new boolean[N];    // ์นœ๊ตฌ๋“ค์ด ํƒ”๋Š”์ง€ ์•ˆํƒ”๋Š”์ง€ ํŒ๋‹จํ•˜๋Š” ๋ฐฐ์—ด

        int rideDriver = 0;
        while(!carQueue.isEmpty()) {
            Car car = carQueue.poll();
            // ์šด์ „์ž๋งŒ ๋จผ์ € ํƒœ์šธ์ˆ˜ ์žˆ๋Š” ๋งŒํผ ๋„ฃ์–ด์ฃผ๊ธฐ
            for (int number = 0; number < driver; number++) {
                if(car.getLocation() == friends.get(number).getLocation() && !ride[number]) {
                    available[car.getLocation()] += car.getAvailable() - 1; // ์œ„์น˜๋ณ„ ์šด์ „์ž ์ œ์™ธํ•˜๊ณ  ์ž๋™์ฐจ์— ํƒˆ ์ˆ˜ ์žˆ๋Š” ์ธ์›์ˆ˜ ์ถ”๊ฐ€
                    ride[number] = true;
                    rideDriver++;       // ์šด์ „ํ•˜๋Š” ์นœ๊ตฌ๋“ค ์นด์šดํŒ…
                    break;
                }
            }
        }

        int count = 0;
        for (int number = 0; number < friends.size(); number++) {
            Friend friend = friends.get(number);
            if(available[friend.getLocation()] > 0 && !ride[number] ) available[friend.getLocation()]--;    // ์ž๋ฆฌ๊ฐ€ ๋‚จ์•˜๊ณ , ์•„์ง ์ฐจ์— ์•ˆํƒ„ ์นœ๊ตฌ๋ฉด ํƒœ์šฐ๊ธฐ
            else count++;
        }

        // ์šด์ „์ž ์นœ๊ตฌ๋“ค์€ ์ด๋ฏธ ride ๋ฐฐ์—ด์ด true์ด๋ฏ€๋กœ ์œ„์— ์นœ๊ตฌ๋“ค์„ ํƒœ์šธ ๋•Œ ์šด์ „์ž๋„ ๊ฐ™์ด ์นด์šดํŒ…๋œ๋‹ค.
        // ๋”ฐ๋ผ์„œ, ์šด์ „์ž ์นœ๊ตฌ๋“ค ๋งŒํผ ๋นผ์ค€๋‹ค.
        return count - rideDriver;
    }

    static class Friend implements Comparable<Friend> {
        private int location;
        private String drunk;

        public Friend(int location, String drunk) {
            this.location = location;
            this.drunk = drunk;
        }

        public int getLocation() {
            return location;
        }

        public String getDrunk() {
            return drunk;
        }

        @Override
        public int compareTo(Friend o) {
            if(o.drunk.equals(this.drunk))
                return Integer.compare(this.location, o.location);
            return o.drunk.compareTo(this.drunk);
        }
    }

    static class Car implements Comparable<Car> {
        private int location;
        private int available;

        public Car(int location, int available) {
            this.location = location;
            this.available = available;
        }

        public int getLocation() {
            return location;
        }

        public int getAvailable() {
            return available;
        }

        @Override
        public int compareTo(Car o) {
            if(this.location == o.location)
                return Integer.compare(o.available, this.available);
            return Integer.compare(this.location, o.location);
        }
    }
}
๋ฐ˜์‘ํ˜•