๋ณธ๋ฌธ์œผ๋กœ ๋ฐ”๋กœ๊ฐ€๊ธฐ

https://softeer.ai/practice/info.do?idx=1&eid=626&sw_prbl_sbms_sn=178347 

 

Softeer

์—ฐ์Šต๋ฌธ์ œ๋ฅผ ๋‹ด์„ Set์„ ์„ ํƒํ•ด์ฃผ์„ธ์š”. ์ทจ์†Œ ํ™•์ธ

softeer.ai


1. ๋ฌธ์ œ

N๊ฐœ์˜ ํšŒ์˜์‹ค, M๊ฐœ์˜ ์˜ˆ์•ฝํ˜„ํ™ฉ์ด ์ฃผ์–ด์ง€๊ณ  ํšŒ์˜์‹ค๋งˆ๋‹ค ์˜ˆ์•ฝ์ด ์ฐจ์ง€ ์•Š์€ ์‹œ๊ฐ„๋Œ€์˜ ๊ฐœ์ˆ˜์™€ ์‹œ๊ฐ„๋Œ€๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

 

2. ํ’€์ด

TreeMap, StringBuilder, ์ด์ฐจ์›๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•œ ๊ตฌํ˜„ ๋ฌธ์ œ๋‹ค.

TreeMap

- ์ด์ „์—๋Š” HashMap์„ ์‚ฌ์šฉํ–ˆ๋Š”๋ฐ ๋งค๋ฒˆ pq์—๋„ ๊ฐ™์ด ๋„ฃ์–ด์„œ ์ •๋ ฌํ•œ ํ›„ pollํ•œ ๊ฐ’์„ HashMap์˜ key๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์˜ค๋ฆ„์ฐจ์ˆœ์„ ๊ตฌํ˜„ํ–ˆ๋‹ค. ํ•˜์ง€๋งŒ ํ›จ์”ฌ ์œ ์šฉํ•˜๊ฒŒ ์“ฐ์ด๋Š” ์ž๋ฃŒ๊ตฌ์กฐ TreeMap์ด๋ž€๊ฑธ ์•Œ๊ฒŒ๋˜์—ˆ๋‹ค.

- TreeMap์€ key๊ฐ’์„ ์ž๋™์œผ๋กœ ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌํ•ด์ค€๋‹ค. ๋”ฐ๋ผ์„œ HashMap๋ณด๋‹ค๋Š” ์„ฑ๋Šฅ์ด ์•ˆ์ข‹์ง€๋งŒ ์ง€๊ธˆ ๊ฐ™์€ ๋งค๋ฒˆ key๊ฐ’ ์ •๋ ฌ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ์—” ํšจ์œจ์ ์ด๋‹ค.

- ๊ทธ๋ฆฌ๊ณ  ๊ธฐ์กด์˜ HashMap๊ณผ String์—์„œ TreeMap๊ณผ StringBuilder๋กœ ๋ฐ”๊พธ๋‹ˆ ์‹คํ–‰์‹œ๊ฐ„์ด 3๋ฐฐ๊ฐ€ ์ค„์—ˆ๋‹ค.

- Map์˜ ํ˜•ํƒœ๊ฐ€ <String, int[][]> ํ˜•ํƒœ์ธ๋ฐ, value๊ฐ’์„ ๋”ฐ๋กœ int[][] tmp ์— ๋„ฃ์–ด์„œ ๊ทธ tmp์˜ ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๋ฉด ๋ณต์‚ฌ๋œ ๋ฐฐ์—ด์ด ๋ณ€๊ฒฝ๋˜๋Š”๊ฒŒ ๋งž๋‹ค.

 

StringBuilder

- StringBuilder๋Š” ์ •์ˆ˜๋ฅผ appendํ•ด๋„ ๋ฌธ์ž์—ด๋กœ ๋ฐ”๊ฟ”์ฃผ๋Š”๊ฐ€? => O

- append๊ฐ€ String์˜ + ์—ฐ์‚ฐ๋ณด๋‹ค ๋น ๋ฅธ๊ฐ€? => "์—ฐ์‚ฐ ์†๋„๋Š” ๋น„์Šทํ•˜๋‚˜ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์ ˆ์•ฝ๋œ๋‹ค."

์ด๊ฒŒ ๋ฌด์Šจ ๋ง์ด๋ƒ๋ฉด

1. + ์—ฐ์‚ฐ ์‚ฌ์šฉํ•˜์—ฌ ๋ฌธ์ž์—ด์„ ์กฐํ•ฉํ•  ๋•Œ๋งˆ๋‹ค ์ƒˆ๋กœ์šด String ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. ์ด ๊ฐ์ฒด๋Š” GC์˜ ์ˆ˜๊ฑฐ ๋Œ€์ƒ์ด ๋œ๋‹ค.

- +๋กœ String๊ฐ์ฒด 100๊ฐœ ์ด์–ด๋ถ™์ด๋ฉด ๋ฉ”๋ชจ๋ฆฌ 100๊ฐœ๊ฐ€ ๋‚ญ๋น„๋˜๋Š” ์…ˆ.

- ์ฆ‰, +์—ฐ์‚ฐ์ด ๋งŽ์•„์งˆ ์ˆ˜๋ก ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋‚ญ๋น„๋˜๊ณ , ์ด๋กœ ์ธํ•ด ๊ฐ€๋น„์ง€ ์ฝœ๋ ‰์…˜์ด ์ž์ฃผ ๋ฐœ์ƒํ•˜์—ฌ ์„ฑ๋Šฅ ์ €ํ•˜๋ฅผ ์œ ๋ฐœํ•œ๋‹ค.

 (+์—ฐ์‚ฐ์ถ”๊ฐ€ -> ๋ฉ”๋ชจ๋ฆฌ ๋‚ญ๋น„ -> GC์ž์ฃผ๋ฐœ์ƒ -> ์„ฑ๋Šฅ์ €ํ•˜)

2. StringBuilder๋Š” ํด๋ž˜์Šค๋‹ค. append๋กœ ๋ฌธ์ž์—ด์„ ์กฐํ•ฉํ•  ๋•Œ String ๊ฐ์ฒด๋ฅผ ์ƒˆ๋กœ ์ƒ์„ฑํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ ˆ์•ฝํ•  ์ˆ˜ ์žˆ๋‹ค.

- +์—ฐ์‚ฐ๋ณด๋‹ค๋Š” StringBuilder๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ ˆ์•ฝํ•˜์ž

 

์ด์ฐจ์›๋ฐฐ์—ด

- ๊ธฐ์กด์—๋Š” ์ผ์ฐจ์›๋ฐฐ์—ด์„ ๋งŒ๋“ค์–ด์„œ boolean[] time ์ด๋Ÿฐ์‹์œผ๋กœ ์˜ˆ์•ฝ์ด์ฐผ์œผ๋ฉด true ๋ฅผ ๋„ฃ์–ด์ฃผ์—ˆ๋Š”๋ฐ ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ด์ƒํ•˜๊ฒŒ 30์ ์œผ๋กœ ์ฑ„์ ๋๋‹ค.. 

- tmp[9][2]๋กœ ์ƒ์„ฑํ•˜์—ฌ ์‹œ๊ฐ„๋Œ€๋งˆ๋‹ค [0]์€ ์‹ค์ œ ์‹œ์ž‘์‹œ๊ฐ„(idx+9์‹œ๊ฐ„), [1]์€ ์‹ค์ œ ์ข…๋ฃŒ์‹œ๊ฐ„(idx+9์‹œ๊ฐ„)์„ ๋„ฃ์–ด์คฌ๋‹ค.

 

3. ์ฝ”๋“œ

import java.util.*;
import java.io.*;


public class Main
{

    static int N,M;
    static Map<String, int[][]> reservation = new TreeMap<> ();
    
    public static void main(String args[]) throws Exception
    {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        N = Integer.parseInt(st.nextToken());
        M = Integer.parseInt(st.nextToken());
        for (int i=0; i<N; i++) {
            int[][] tmp = new int[9][2];
            for (int j= 0; j<9; j++) {
                tmp[j][0] = j+9;      //์‹œ์ž‘์‹œ๊ฐ„
                tmp[j][1] = j+9+1;    //๋์‹œ๊ฐ„
            }
            reservation.put(br.readLine(), tmp);
        } 
        for (int j=0; j<M; j++) {
            st = new StringTokenizer(br.readLine());
            String name = st.nextToken();
            int start = Integer.parseInt(st.nextToken());
            int end = Integer.parseInt(st.nextToken());

            int[][] checked = reservation.get(name); //๋ณต์‚ฌ๊ฐ€ ์•„๋‹˜. ์ˆ˜์ •ํ•˜๋ฉด ์›๋ณธ์ด ์ˆ˜์ •๋œ๋‹ค?
            for (int t = start; t<end; t++) {
                checked[t-9][0] = -1; //์˜ˆ์•ฝ์™„๋ฃŒ
                checked[t-9][1] = -1; //์˜ˆ์•ฝ์™„๋ฃŒ
            }
        } //์ž…๋ ฅ ๋
        
        StringBuilder sb = new StringBuilder();
        for (Map.Entry<String, int[][]> entry : reservation.entrySet()) {
            sb.append("Room ").append(entry.getKey()).append(":").append("\n");
            StringBuilder tmpSb = new StringBuilder();

            int[][] checked = entry.getValue();
            int cnt = 0;
            int start = -1;
            int end = -1;
            for (int i = 0; i<9; i++) {
                if (checked[i][0] != -1) {
                    if (start == -1) {
                        start = checked[i][0];
                    }
                } else {
                    if (start != -1) {
                        end = checked[i-1][1];
                    }
                }
                if (start != -1 && end != -1) {
                    tmpSb.append(start==9?"09":start).append("-").append(end).append("\n");
                    start = -1;
                    end = -1;
                    cnt++;
                }
            }

            if (start != -1) {
                cnt++;
                tmpSb.append(start==9? "09":start).append("-").append(18).append("\n");
            }

            if (cnt == 0) {
                sb.append("Not available").append("\n");
            } else {
                sb.append(cnt).append(" available:").append("\n");
                sb.append(tmpSb);
            }
            sb.append("-----").append("\n");
        }
        sb.setLength(sb.length()-6); //๊ธธ์ด์กฐ์ ˆ๋กœ ๋งˆ์ง€๋ง‰์ค„ -----\n์„ ์ž๋ฅธ๋‹ค.
        System.out.println(sb);
    }
}

 

4. ์‚ฌ๋‹ด

๊พธ์ค€ํžˆ ํ’€์ž

TreeMap, StringBuilder ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ๋“ฏํ•˜๋‹ค.