Algorithm/ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€

ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ - ν˜Έν…” λŒ€μ‹€

giraffe_ 2023. 8. 4. 22:57

https://school.programmers.co.kr/learn/courses/30/lessons/155651

 

ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€

μ½”λ“œ μ€‘μ‹¬μ˜ 개발자 μ±„μš©. μŠ€νƒ 기반의 ν¬μ§€μ…˜ λ§€μΉ­. ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€μ˜ 개발자 λ§žμΆ€ν˜• ν”„λ‘œν•„μ„ λ“±λ‘ν•˜κ³ , λ‚˜μ™€ 기술 ꢁ합이 잘 λ§žλŠ” 기업듀을 λ§€μΉ­ λ°›μœΌμ„Έμš”.

programmers.co.kr

 

 

 

 

 

문제

  • μ΅œμ†Œν•œμ˜ κ°μ‹€λ§Œμ„ μ‚¬μš©ν•˜μ—¬ μ˜ˆμ•½ μ†λ‹˜λ“€μ„ λ°›μŒ.
  • ν•œ 번 μ‚¬μš©ν•œ 객싀은 퇴싀 μ‹œκ°„μ„ κΈ°μ€€μœΌλ‘œ 10λΆ„κ°„ μ²­μ†Œλ₯Ό ν•˜κ³  λ‹€μŒ μ†λ‹˜λ“€μ΄ μ‚¬μš©ν•  수 있음.
  • ν•„μš”ν•œ μ΅œμ†Œ κ°μ‹€μ˜ 수 κ΅¬ν•˜κΈ°

 

  • 1 ≤ book_time의 길이 ≤ 1,000
  • book_time[i]λŠ” ["HH:MM", "HH:MM"]의 ν˜•νƒœλ‘œ 이루어진 λ°°μ—΄

 

μž…μΆœλ ₯ μ˜ˆμ‹œ

  • μž…λ ₯ : book_time [["15:00", "17:00"], ["16:40", "18:20"], ["14:20", "15:20"], ["14:10", "19:20"], ["18:20", "21:20"]]
  • 좜λ ₯ : 3

 

좜처 : ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ (https://school.programmers.co.kr/learn/courses/30/lessons/155651)

 

 

 

 

 

풀이

κ·Έλ¦¬λ””ν•œ λ°©λ²•μœΌλ‘œ ν’€μ–΄μ•Ό ν•˜λŠ” λ¬Έμ œμ΄λ‹€. μ‹œμž‘ μ‹œκ°„μ΄ λΉ λ₯Έ 것뢀터 μ°¨λ‘€λ‘œ 방에 λ„£μ–΄μ•Ό ν•œλ‹€.

μ €λ ‡κ²Œ μ‹œμž‘ μ‹œκ°„κ³Ό λλ‚˜λŠ” μ‹œκ°„μ΄ μ£Όμ–΄μ§€κ³  μ΅œλŒ“κ°’μ΄λ‚˜ μ΅œμ†Ÿκ°’μ„ κ΅¬ν•˜λŠ” 문제 μœ ν˜•μœΌλ‘œ νšŒμ˜μ‹€ λ¬Έμ œκ°€ 유λͺ…ν•˜λ‹€.

 

λ°±μ€€ - νšŒμ˜μ‹€ λ°°μ • (https://www.acmicpc.net/problem/1931)

ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ - μš”κ²© μ‹œμŠ€ν…œ (https://school.programmers.co.kr/learn/courses/30/lessons/181188)

 

 

 

'ν˜Έν…” λŒ€μ‹€' λ¬Έμ œλ„ νšŒμ˜μ‹€ λ¬Έμ œμ™€ 풀이가 λΉ„μŠ·ν•˜λ‚˜ 더 생각해야 될 뢀뢄이 μžˆμ—ˆλ‹€.

 

  • String("HH:MM") ν˜•νƒœμ˜ 값을 λΆ„ λ‹¨μœ„(int)둜 λ°”κΎΈκΈ°
    • timeToInt ν•¨μˆ˜ :  ":"λ₯Ό κΈ°μ€€μœΌλ‘œ μ‹œκ°„κ³Ό 뢄을 λ‚˜λˆ„κ³ , λΆ„μœΌλ‘œ μ—°μ‚°ν•΄ 리턴

 

  • μ‹œμž‘ μ‹œκ°„μ„ κΈ°μ€€μœΌλ‘œ μ˜€λ¦„μ°¨μˆœ μ •λ ¬ν•˜κΈ°
    • μ˜ˆμ•½μ„ μ‹œμž‘ μ‹œκ°„μ— 맞좰 μ°¨λ‘€λŒ€λ‘œ 방에 λ°°μ •ν•  것이닀. 

 

  • μ΅œμ†Œνž™(μš°μ„ μˆœμœ„ 큐) μ‚¬μš©
    • μ΅œμ†Œμ˜ 방을 μ“°λ €λ©΄, μƒˆλ‘œμš΄ μ˜ˆμ•½ μ‹œκ°„μ„ 방에 λ°°μ •ν•  λ•Œ μ˜ˆμ•½μ΄ 빨리 λλ‚˜λŠ” 방을 μ°Ύμ•„ 비ꡐλ₯Ό ν•΄μ•Ό ν•œλ‹€. 큐에 λŒ€μ‹€ 쀑인 μ˜ˆμ•½λ“€μ„ λ„£κ³ , μ΅œμ†Œνž™μœΌλ‘œ 정렬을 ν•΄ front에 빨리 λλ‚˜λŠ” μ‹œκ°„μ΄ λ‚˜μ˜€λ„λ‘ ν•œλ‹€.
    • μ˜ˆμ•½μ΄ 빨리 λλ‚˜λŠ” 방의 μ’…λ£Œ μ‹œκ°„ + 10(μ²­μ†Œμ‹œκ°„)을 κΈ°μ€€μœΌλ‘œ μƒˆλ‘œμš΄ μ˜ˆμ•½ μ‹œκ°„μ΄
      • 뒀에 μžˆλ‹€λ©΄, μƒˆλ‘œ 방을 λ°°μ •ν•  ν•„μš”κ°€ μ—†λ‹€. (μ΄μ „μ˜ μ˜ˆμ•½μ„ λŒ€μ‹€ 쀑인 νμ—μ„œ μ œκ±°ν•΄μ€€λ‹€.)
      • μ•žμ— μžˆλ‹€λ©΄, μ‹œκ°„μ΄ κ²ΉμΉ˜λ―€λ‘œ μƒˆλ‘œ 방을 λ°°μ •ν•΄μ•Ό ν•œλ‹€. (μ •λ‹΅ 카운트λ₯Ό λŠ˜λ¦°λ‹€)
      • λŒ€μ‹€ 쀑인 큐에 λ„£λŠ”λ‹€.

 

 

좜처 : λ‚˜

 

 

 

 

 

μ½”λ“œ

import java.util.*;

class Solution {
    public int solution(String[][] book_time) {
        //λΆ„λ‹¨μœ„λ‘œ λ°”κΎΈκΈ°
        int[][] times = new int[book_time.length][2];
        
        for(int i = 0; i < book_time.length; i++) {
            for(int j = 0; j < 2; j++) {
                times[i][j] = timeToInt(book_time[i][j]); 
            }
        }
        
        //μ‹œμž‘ μ‹œκ°„ κΈ°μ€€μœΌλ‘œ μ˜€λ¦„μ°¨μˆœ μ •λ ¬
        Arrays.sort(times, (o1, o2) -> o1[0] == o2[0] ? o1[1] - o2[1] : o1[0] - o2[0]); 
        
        //λλ‚˜λŠ” μ‹œκ°„ + 10(μ²­μ†Œμ‹œκ°„) > λ‹€μŒ μ‹œμž‘ μ‹œκ°„ -> μƒˆλ‘œμš΄ λ°©
        int answer = 1;
        PriorityQueue<Integer> queue = new PriorityQueue<>(); //λŒ€μ‹€ 쀑
        queue.add(times[0][1]);
        
        for(int i = 1; i < times.length; i++) {
            if(queue.peek() + 10 > times[i][0]) {
                answer++;
            } else {
                queue.remove();
            }
            queue.add(times[i][1]);
        }
        
        return answer;
    }
    
    public int timeToInt(String time) {
        String[] str = time.split(":");
        return 60 * Integer.parseInt(str[0]) + Integer.parseInt(str[1]);
    }
}

 

 

 

 

 

κ²°κ³Ό

 

 

 

 

 

배운점

  • μ΅œμ†Œ νž™(μš°μ„ μˆœμœ„ 큐) μ‚¬μš©