11function solution ( fees , records ) {
2- // 정렬 차량번호가 작은순
3- records = records . map ( r => r . split ( " " ) ) ;
4- records . sort ( ( a , b ) => a [ 1 ] - b [ 1 ] ) ; // 오름차순
5-
6- // {차량번호: [시각, 시각, 시각, ...]}
7- const car_map = new Map ( ) ;
8-
9- for ( const r of records ) {
10- const times = car_map . get ( r [ 1 ] ) || [ ] ;
11- times . push ( r [ 0 ] )
12- car_map . set ( r [ 1 ] , times )
2+ const parkingTime = { } ;
3+ records . forEach ( r => {
4+ let [ time , id , type ] = r . split ( ' ' ) ;
5+ let [ h , m ] = time . split ( ':' ) ;
6+ time = ( h * 1 ) * 60 + ( m * 1 ) ;
7+ if ( ! parkingTime [ id ] ) parkingTime [ id ] = 0 ;
8+ if ( type === 'IN' ) parkingTime [ id ] += ( 1439 - time ) ;
9+ if ( type === 'OUT' ) parkingTime [ id ] -= ( 1439 - time ) ;
10+ } ) ;
11+ const answer = [ ] ;
12+ for ( let [ car , time ] of Object . entries ( parkingTime ) ) {
13+ if ( time <= fees [ 0 ] ) time = fees [ 1 ] ;
14+ else time = Math . ceil ( ( time - fees [ 0 ] ) / fees [ 2 ] ) * fees [ 3 ] + fees [ 1 ]
15+ answer . push ( [ car , time ] ) ;
1316 }
14-
15- // 누적 시간 구하기
16- const total_times = [ ] ;
17- // 문자열 변환
18- const str_to_time = ( str_time ) => {
19- const [ hour , min ] = str_time . split ( ":" ) ;
20- return Number ( hour ) * 60 + Number ( min ) ;
21- }
22-
23- car_map . forEach ( car_in_out => {
24- // 마지막 출차가 없는 경우 23:59를 마지막으로 간주
25- if ( car_in_out . length % 2 !== 0 ) car_in_out . push ( '23:59' ) ;
26-
27- let total_time = 0 ;
28- for ( let i = 0 ; i < car_in_out . length ; i += 2 ) {
29- const start = str_to_time ( car_in_out [ i ] ) ;
30- const end = str_to_time ( car_in_out [ i + 1 ] ) ;
31- const timeDiff = end - start ;
32- total_time += timeDiff ;
33- }
34- total_times . push ( total_time ) ;
35- } )
36-
37- // 요금
38- const calc_fee = ( time ) => {
39- const extra_charge = time < fees [ 0 ] ? 0 : Math . ceil ( ( time - fees [ 0 ] ) / fees [ 2 ] ) * fees [ 3 ] ;
40- return fees [ 1 ] + extra_charge ;
41- }
42-
43- return total_times . map ( time => calc_fee ( time ) ) ;
17+ return answer . sort ( ( a , b ) => a [ 0 ] - b [ 0 ] ) . map ( v => v [ 1 ] ) ;
4418}
0 commit comments