🔎 문제
🧩 구현과정 및 코드
개인 토글 영역에 구현 과정과 코드를 자유롭게 작성해주시면 됩니다.
사용할 데이터 구조와 풀이 방향성
적용할 알고리즘 혹은 메서드
수영
구현
- class를 떠올림(javascript 프로토타입)
- records 1행씩 split
- key를 carId로 cars{}에 carId가 있는지 확인
- 있으면, status===OUT 확인하고, time 계산
- 없으면, 첫 차량 → 등록(time, id, status)
- cars 정렬
- 요금 계산(3가지 경우)
- 정상
- 차량 상태 IN : 안 나갔으니 OUT 23:59로 계산
- baseTime < time : 기본 요금
코드
참고[비슷한 플로우]
function solution(fees, records) { const cars = {}; records.forEach(v => { let [time, car, type] = v.split(" "); const [hour, minute] = time.split(":"); time = hour * 60 + Number(minute); if (!cars[car]) { cars[car] = { time: 0, car }; } cars[car].type = type; if (type == "OUT") { cars[car].time += time - cars[car].lastInTime; return; } cars[car].lastInTime = time; }); return Object.values(cars) .sort((a, b) => a.car - b.car) .map(v => { // 차량이 최종적으로 나가지 않았을 때 if (v.type == "IN") { v.time += 1439 - v.lastInTime; } // 기본시간을 넘지 않았을 때 if (fees[0] > v.time) { return fees[1]; } return fees[1] + Math.ceil((v.time - fees[0]) / fees[2]) * fees[3]; }); }
정은
구현
- 딕셔너리(해쉬)에 차 번호마다 번호
코드
import math def solution(fees, records): cars_fees = dict() #요금, 시간 #기본 시간, 기본요금, 단위시간, 단위요금 for record in records: car_num=record[6:10] if not car_num in cars_fees: cars_fees[car_num] = [0,0] time = int(record[:2])*60+int(record[3:5]) if record[11:] == "OUT" : total_time = time-cars_fees[car_num][1] if total_time > fees[0]: total_time -= fees[0] cars_fees[car_num][0] += math.ceil(total_time / fees[2]) * fees[3] cars_fees[car_num][0] += fees[1] cars_fees[car_num][1] = 0 else: cars_fees[car_num][1] = time for cars_fee in cars_fees: if cars_fee[1]: cars_fee[0] += math.ceil(11*60+59-cars_fee[1]) * fees[3] return cars_fees
종혁
구현
- 시간단위를 전부 초로 통일
- 차 번호를 기준으로 오름차순 정렬 후(cars 배열), In과 Out이 동시에 존재하는 경우와 In만 존재하는 경우를 따로 계산
코드
function solution(fees, records) { const map = new Map() const [baseTime,baseFee,extraTime,extraFee] = fees const maxTime = 23*60 + 59 const calculate = (time) => { if(time < baseTime){ return baseFee } return baseFee + Math.ceil((time-baseTime)/extraTime) * extraFee } const datas = records.map((record) => { const arr = record.split(' ') const [h,m] = arr[0].split(':').map(v => +v) arr[0] = h*60 + m if(!map.get(arr[1])){map.set(arr[1],0)} return arr }) const cars = Array.from(map.keys()).sort((a,b) => a - b) //datas : [ [ 960, '3961', 'IN' ], [ 960, '0202', 'IN' ], [ 1080, '3961', 'OUT' ], [ 1080, '0202', 'OUT' ], [ 1438, '3961', 'IN' ] ] //cars : [ '0202', '3961' ] return cars.map((car) => { let [time,i] = [0,0] const log = datas.filter((data) => data[1] === car) while(i<log.length){ if(log[i][2] !== 'IN'){ i+=1 continue } if(i+1 < log.length && log[i+1][2] === 'OUT'){ time += log[i+1][0] - log[i][0] }else{ time+= maxTime - log[i][0]//In만 하고 출차를 안한 경우 } i+=1 } return calculate(time) }) //in을 만났으면 -> out이 있거나 or 없거나임 }
재웅
구현
- 차량 번호와 매칭, 입/출차 기록을 객체 내의 배열로 관리
- 차량 별로 순회하며 입/출차 기록을 한 쌍씩 묶어 요금 계산
- 마지막 기록이 IN인 경우, 임의로 OUT("23:59") 부여
- 머무른 시간을 계산하고 요금을 매김 (함수)
- 차량 번호 오름차순으로 정렬, 최종적인 비용을 반환
코드
function solution(fees, records) { let dst = []; let obj = {} const splitted = records.map((el)=>el.split(" ")) // 차량 번호와 매칭, 입/출차 기록을 객체 내의 배열로 관리 splitted.forEach((el,idx)=>{ obj[el[1]]?obj[el[1]].push([el[0],el[2]]):obj[el[1]]=[[el[0],el[2]]] }) // console #1 // 차량 별로 순회하며 입/출차 기록을 한 쌍씩 묶어 요금 계산 // 마지막 기록이 IN인 경우, 임의로 OUT("23:59") 부여 for(const key in obj){ let remainTime = 0 obj[key].forEach((history,idx)=>{ if(history[1]==='IN'){ const intime = history[0] let outtime ='' if(obj[key].length-1===idx) outtime = '23:59' else outtime = obj[key][idx+1][0] remainTime+=getDifferMin(intime,outtime) } }) dst.push([fee(remainTime,fees),+key]) } // 차량 번호 오름차순으로 정렬, 최종적인 비용만 반환 const answer = dst.sort((a,b)=>a[1]-b[1]).map((el)=>el[0]) return answer; } // 입차 시간과 출력 시간을 입력으로 받아 머무른 시간을 분 단위로 반환 function getDifferMin(input,output) { const intime = input.split(":").map((el)=>+el) const outtime = output.split(":").map((el)=>+el) let minute = 0 if(intime[1]<=outtime[1]){ minute+= (outtime[1]-intime[1]) minute+= (outtime[0]-intime[0])*60 } else { minute+= (60-intime[1]+outtime[1]) minute+= (outtime[0]-intime[0]-1)*60 } return minute } // 누적시간(분)을 입력으로 받고, 계산된 요금을 반환 function fee(time,fees){ const [dTime,dFee,pTime,pFee] = fees return time>=dTime?dFee + Math.ceil((time-dTime)/pTime)*pFee:dFee }
// console #1 { '5961': [ [ '05:34', 'IN' ], [ '07:59', 'OUT' ], [ '22:59', 'IN' ], [ '23:00', 'OUT' ] ], '0000': [ [ '06:00', 'IN' ], [ '06:34', 'OUT' ], [ '18:59', 'IN' ] ], '0148': [ [ '07:59', 'IN' ], [ '19:09', 'OUT' ] ] }
✏️ 후기
문제를 풀고 느낀 점, 막혔던 부분 혹은 개선 사항 등을 자유롭게 작성해주시면 됩니다.
수영
자료구조, 알고리즘 코드 응용이 안된다.🥲
문제는 재밌고 이해도 되는데 왜 내 손은 가만히 있니
정은
- 배열 원소들을 변수로 선언해주는게 깔끔하다!!
- 인덱스로 접근하니 갈수록 복잡해져서 나마저도 헷갈리는 상황이 됐었다 ㅋ
- 계산은 마지막에 한번만해서 코드 중복을 줄일 수 있을 것 같다.
- 많이 복잡한 문제는 아니었던 것 같은데, 배열의 인덱스로 값을 가져오다 보니 디버깅이 어려워져서 불필요한 시간이 많이 걸렸었다.. 😞
- 다시 풀어보기
종혁
- 주차비 계산하는 과정에서 조금 헤메었던것 같다
- 불필요하게 코드가 길어진감이 있는것같다
재웅
역시 재밌는 빡구현..