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

 

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค

์ฝ”๋“œ ์ค‘์‹ฌ์˜ ๊ฐœ๋ฐœ์ž ์ฑ„์šฉ. ์Šคํƒ ๊ธฐ๋ฐ˜์˜ ํฌ์ง€์…˜ ๋งค์นญ. ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค์˜ ๊ฐœ๋ฐœ์ž ๋งž์ถคํ˜• ํ”„๋กœํ•„์„ ๋“ฑ๋กํ•˜๊ณ , ๋‚˜์™€ ๊ธฐ์ˆ  ๊ถํ•ฉ์ด ์ž˜ ๋งž๋Š” ๊ธฐ์—…๋“ค์„ ๋งค์นญ ๋ฐ›์œผ์„ธ์š”.

programmers.co.kr

 

 

 

 

 

๐Ÿ“‘ ๋ฌธ์ œ ์š”์•ฝ

์ž…๋ ฅ

  • ์ž…๋ ฅ๊ฐ’ : ์ฃผ์ฐจ ์š”๊ธˆํ‘œ(fees), ์ฐจ๋Ÿ‰์˜ ์ž…์ฐจ/์ถœ์ฐจ ๊ธฐ๋ก(records)
    • ์˜ˆ์‹œ
      • fees [180, 5000, 10, 600] : ๊ธฐ๋ณธ ์‹œ๊ฐ„(๋ถ„), ๊ธฐ๋ณธ ์š”๊ธˆ(์›), ๋‹จ์œ„ ์‹œ๊ฐ„(๋ถ„), ๋‹จ์œ„ ์š”๊ธˆ(์›)
      • records ["05:34 5961 IN", "06:00 0000 IN", "06:34 0000 OUT", "07:59 5961 OUT", "07:59 0148 IN", "18:59 0000 IN", "19:09 0148 OUT", "22:59 5961 IN", "23:00 5961 OUT"] : ์‹œ๊ฐ(์‹œ:๋ถ„), ์ฐจ๋Ÿ‰ ๋ฒˆํ˜ธ, ๋‚ด์—ญ
  • ๊ฒฐ๊ณผ๊ฐ’ : ์ฐจ๋Ÿ‰ ๋ฒˆํ˜ธ๊ฐ€ ์ž‘์€ ์ž๋™์ฐจ๋ถ€ํ„ฐ ์ฒญ๊ตฌํ•  ์ฃผ์ฐจ ์š”๊ธˆ
    • ์˜ˆ์‹œ
      • [14600, 34400, 5000]

 

์กฐ๊ฑด

  • ์ž…์ฐจ๋œ ํ›„ ์ถœ์ฐจ๋œ ๋‚ด์—ญ ์—†์œผ๋ฉด 23:59์— ์ถœ์ฐจ๋œ ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผ
  • ์ฐจ๋Ÿ‰๋ณ„ ๋ˆ„์  ์ฃผ์ฐจ ์‹œ๊ฐ„์„ ๊ณ„์‚ฐํ•˜์—ฌ ์š”๊ธˆ์„ ์ผ๊ด„๋กœ ์ •์‚ฐ
  • ๋ˆ„์  ์ฃผ์ฐจ ์‹œ๊ฐ„์ด ๊ธฐ๋ณธ ์‹œ๊ฐ„์ดํ•˜๋ผ๋ฉด, ๊ธฐ๋ณธ ์š”๊ธˆ
    • ๊ธฐ๋ณธ ์‹œ๊ฐ„์„ ์ดˆ๊ณผํ•˜๋ฉด, ๊ธฐ๋ณธ ์š”๊ธˆ์— ๋”ํ•ด์„œ, ์ดˆ๊ณผํ•œ ์‹œ๊ฐ„์— ๋Œ€ํ•ด์„œ ๋‹จ์œ„ ์‹œ๊ฐ„ ๋งˆ๋‹ค ๋‹จ์œ„ ์š”๊ธˆ์„ ์ฒญ๊ตฌ
    • ์ดˆ๊ณผํ•œ ์‹œ๊ฐ„์ด ๋‹จ์œ„ ์‹œ๊ฐ„์œผ๋กœ ๋‚˜๋ˆ„์–ด ๋–จ์–ด์ง€์ง€ ์•Š์œผ๋ฉด, ์˜ฌ๋ฆผ

์ œํ•œ

  • fees์˜ ๊ธธ์ด = 4
  • 1 โ‰ค records์˜ ๊ธธ์ด โ‰ค 1,000

 

 

 

๐Ÿ’ก ๊ตฌํ˜„ํ•˜๊ธฐ

์ž๋ฃŒ ๊ตฌ์กฐ

  • HashMap
    • ์‹œ๊ฐ„๋ณต์žก๋„ : put - O(1), get - O(1), containskey - O(1)
      • ArrayList์™€ ๋น„๊ต : add - O(n), get - O(1), remov(1)
    • recordMap : ์ฐจ๋Ÿ‰ ๋ฒˆํ˜ธ๋ฅผ key๋กœ ํ•ด์„œ, ์ž…์ฐจ ์‹œ๊ฐ„์„ ์ €์žฅ
  • TreeMap 
    • SortedMap ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ƒ์†๋ฐ›๋Š” ํด๋ž˜์Šค
    • timeMap : ์ฐจ๋Ÿ‰ ๋ฒˆํ˜ธ๋ฅผ key๋กœ ํ•ด์„œ, ๋ˆ„์  ์ฃผ์ฐจ ์‹œ๊ฐ„์„ value์— ์ €์žฅ

๋กœ์ง

  1. records๋ฅผ ์ฝ์–ด์„œ, ๋ฌธ์ž์—ด ํŒŒ์‹ฑ
  2. IN(์ž…์ฐจ)๋ฉด recordMap์— ๋„ฃ๊ณ ,
  3. OUT์ด๋ฉด recordMap์— ์ €์žฅ๋œ ์ž…์ฐจ ์‹œ๊ฐ„์„ ๊บผ๋‚ด์„œ โ†’ ์ฃผ์ฐจ ์‹œ๊ฐ„์„ ๊ณ„์‚ฐ
  4. ๋ˆ„์  ์ฃผ์ฐจ ์‹œ๊ฐ„ ๊ธฐ๋กํ•˜๊ธฐ
    • timeMap์— ์žˆ์œผ๋ฉด ์š”๊ธˆ ๋ˆ„์ ์‹œํ‚ค๊ณ 
    • ์—†์œผ๋ฉด timeMap์— ์ƒˆ๋กœ ๋„ฃ๊ธฐ
  5. ์ถœ์ฐจ๋œ ๋‚ด์—ญ์ด ์—†์œผ๋ฉด, ์ผ๊ด„ 23:59๋กœ ์ ์šฉํ•ด์„œ โ†’ ์ฃผ์ฐจ ์‹œ๊ฐ„ ๊ณ„์‚ฐ โ†’ ๋ˆ„์  ์ฃผ์ฐจ ์‹œ๊ฐ„์— ๊ธฐ๋กํ•˜๊ธฐ
  6. ์š”๊ธˆํ‘œ์— ๋”ฐ๋ผ ์š”๊ธˆ ๊ณ„์‚ฐํ•˜๊ธฐ

 

 

 

 

๐Ÿ‘ฉ๐Ÿปโ€๐Ÿ’ป ์ฝ”๋“œ

import java.util.*;

class Solution {
    static Map<String, Integer> timeMap; //key: ์ฐจ๋Ÿ‰๋ฒˆํ˜ธ, value: ๋ˆ„์  ์ฃผ์ฐจ ์‹œ๊ฐ„
    
    public int[] solution(int[] fees, String[] records) {
        //records
        HashMap<String, String> recordMap = new HashMap<>(); //key: ์ฐจ๋Ÿ‰๋ฒˆํ˜ธ, value: ์‹œ๊ฐ
        timeMap  = new TreeMap<>(); //์ฐจ๋Ÿ‰ ๋ฒˆํ˜ธ ์ž‘์€ ์ž๋™์ฐจ ์ˆœ์œผ๋กœ ์ •๋ ฌ๋˜๊ฒŒ
        
        for(int i = 0; i < records.length; i++) {
            String[] strs = records[i].split(" ");
            String time = strs[0];
            String num = strs[1];
            String status = strs[2];
            
            if(status.equals("IN")) { //์ž…์ฐจ
                recordMap.put(num, time); //๋งต์— ๋„ฃ๊ธฐ
            } else { //์ถœ์ฐจ
                String inTime = recordMap.get(num);
                recordMap.remove(num);
                
                //์ฃผ์ฐจ์‹œ๊ฐ„ ๊ณ„์‚ฐ
                int parkTime = getParkTime(inTime, time); //์ž…์ฐจ์‹œ๊ฐ„, ์ถœ์ฐจ์‹œ๊ฐ„
                
                //๋ˆ„์  ์ฃผ์ฐจ ์‹œ๊ฐ„ ๊ธฐ๋ก
                if(timeMap.containsKey(num)) { //๋ˆ„์  ์ฃผ์ฐจ ์‹œ๊ฐ„ ๊ธฐ๋ก์— ์žˆ์œผ๋ฉด
                    int minSum = timeMap.get(num);
                    timeMap.put(num, minSum + parkTime); //์š”๊ธˆ ๋ˆ„์ ์‹œํ‚ค๊ธฐ
                } else { //์‹œ๊ฐ„ ๊ธฐ๋ก์— ์—†์œผ๋ฉด
                    timeMap.put(num, parkTime); //์ƒˆ๋กœ ๋„ฃ๊ธฐ
                }
            }
        }
        
        //์ถœ์ฐจ๋œ ๋‚ด์—ญ์ด ์—†์Œ
        for(String key : recordMap.keySet()) {
            String inTime = recordMap.get(key);
            
            //์ฃผ์ฐจ์‹œ๊ฐ„ ๊ณ„์‚ฐ
            int parkTime = getParkTime(inTime, "23:59"); //์ž…์ฐจ์‹œ๊ฐ„, ์ถœ์ฐจ์‹œ๊ฐ„
                
            //๋ˆ„์  ์ฃผ์ฐจ ์‹œ๊ฐ„ ๊ธฐ๋ก
            if(timeMap.containsKey(key)) { //์š”๊ธˆ ๊ธฐ๋ก์— ์žˆ์œผ๋ฉด
                int minSum = timeMap.get(key);
                timeMap.put(key, minSum + parkTime); //์š”๊ธˆ ๋ˆ„์ ์‹œํ‚ค๊ธฐ
            } else { //์š”๊ธˆ ๊ธฐ๋ก์— ์—†์œผ๋ฉด
                timeMap.put(key, parkTime); //์ƒˆ๋กœ ๋„ฃ๊ธฐ
            }
        }
        
        //์š”๊ธˆ ๊ณ„์‚ฐํ•˜๊ธฐ
        int[] answer = new int[timeMap.size()];
        int idx = 0;
        for(String key : timeMap.keySet()) {
            int minSum = timeMap.get(key);
            
            System.out.println(minSum);
            
            int fee = calculateFee(fees, minSum);
            answer[idx] = fee;
            idx++;
        }
        
        return answer;
    }
    
    public int calculateFee(int[] fees, int minSum) { //์š”๊ธˆํ‘œ, ๋ˆ„์  ์ฃผ์ฐจ ์‹œ๊ฐ„
        //fees
        int standardTime = fees[0];
        int standardFee = fees[1];
        int unitTime = fees[2];
        int unitFee = fees[3];
        
        int fee = 0;
        if(minSum <= standardTime) { //๊ธฐ๋ณธ ์‹œ๊ฐ„์ดํ•˜
            fee = standardFee;
        } else { //๊ธฐ๋ณธ ์‹œ๊ฐ„์ดˆ๊ณผ
            fee = standardFee + (int)Math.ceil((minSum - standardTime) / (double)unitTime) * unitFee;
        }
        
        return fee;
    }
    
    public int getParkTime(String inTime, String outTime) { //์ž…์ฐจ์‹œ๊ฐ„, ์ถœ์ฐจ์‹œ๊ฐ„
        String[] inTimeStr = inTime.split(":");
        String[] outTimeStr = outTime.split(":");
        
        int inMinute = Integer.parseInt(inTimeStr[0]) * 60 + Integer.parseInt(inTimeStr[1]);
        int outMinute = Integer.parseInt(outTimeStr[0]) * 60 + Integer.parseInt(outTimeStr[1]);
        
        return outMinute - inMinute;
    }
}

 

 

 

 

 

๐Ÿ”Ž ๊ฒฐ๊ณผ

 

 

 

 

 

๐ŸŽค ํ›„๊ธฐ

  • ์‹œ๊ฐ„๋ณต์žก๋„ ๊ฐœ์„ ์„ ์œ„ํ•œ ์ž๋ฃŒ๊ตฌ์กฐ ์ƒ๊ฐํ•˜๊ธฐ
    • ์ฒ˜์Œ์—๋Š” ArrayList ์“ฐ๋ ค๊ณ  ํ–ˆ๋Š”๋ฐ, ์‹œ๊ฐ„์„ ์ค„์ด๊ธฐ ์œ„ํ•ด HashMap์œผ๋กœ ๊ตฌํ˜„์œผ๋กœ ๋ฐ”๊ฟˆ
  • ์ต์ˆ™ํ•˜์ง€ ์•Š์€ HashMap ๋ฉ”์†Œ๋“œ ์‚ฌ์šฉ
    • put, get, containsKey๋Š” ์ต์ˆ™ํ•จ
    • HashMap ์ „์ฒด๋ฅผ ์กฐํšŒํ•˜๊ธฐ ์œ„ํ•ด hashmap.keySet()์œผ๋กœ ํ‚ค๋กœ ์กฐํšŒํ•˜๋Š” ๋ฐฉ์‹ ์‚ฌ์šฉ
    • HashMap key๋กœ ์ •๋ ฌ : TreeMap์€ SortedMap ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ƒ์†๋ฐ›๋Š” ํด๋ž˜์Šค
    • IDE ์—†์ด ๊ตฌํ˜„ํ•˜๋ ค๋ฉด ์ •๋ ฌ์ด๋‚˜ Iterator ๋“ฑ ๋ฉ”์†Œ๋“œ ๋” ๊ณต๋ถ€ํ•ด์•ผ๊ฒ ๋‹ค๊ณ  ์ƒ๊ฐ
  • ์˜ฌ๋ฆผํ•จ์ˆ˜ ๋ฐ ํ˜•๋ณ€ํ™˜
    • ๋‚˜๋ˆ„๊ธฐ ๊ฒฐ๊ณผ๋กœ ์‹ค์ˆ˜๋ฅผ ์–ป๊ธฐ ์œ„ํ•ด double๋กœ ํ˜•๋ณ€ํ™˜
    • ์˜ฌ๋ฆผ ํ•จ์ˆ˜ ceil ํ›„, int๋กœ ํ˜•๋ณ€ํ™˜
  • ๊ฐ™์€ ๋™์ž‘์„ ์—ฌ๋Ÿฌ ๋ฒˆ ์ˆ˜ํ–‰ํ•˜๋ฏ€๋กœ ํ•จ์ˆ˜ํ™”ํ•˜๋ ค๊ณ  ๋…ธ๋ ฅํ•จ

 

giraffe_