본문 바로가기

알고리즘

프로그래머스 > 2022 KAKAO BLIND RECRUITMENT > 주차 요금 계산

728x90

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

[나의 코드]

function solution(fees,records){
  let answer=[]
  const idTimeMap = new Map()
  for(i=0;i<records.length;i++){
    const [time,id,type]=records[i].split(" ")
    const hour=parseInt(time.split(":")[0])
    const minute=parseInt(time.split(":")[1])
    const modifiedTime =hour*60+minute;
    if(!idTimeMap.get(id)&&type==="IN"){
      //처음 들어올 때
      idTimeMap.set(id,[modifiedTime,type])
    }else if(idTimeMap.get(id)&&type==="OUT"){
      //나갈 때
      prevTime = idTimeMap.get(id)[0]
      idTimeMap.set(id,[modifiedTime-prevTime,type])
    }else if(idTimeMap.get(id)&&type==="IN"){
      //처음 아닌데 들어올 때
      prevTime = idTimeMap.get(id)[0]
      idTimeMap.set(id,[modifiedTime-prevTime,type])
    }else{
      //처음 아닌데 나갈 때
      prevTime = idTimeMap.get(id)[0]
      console.log(modifiedTime)
      idTimeMap.set(id,[modifiedTime+prevTime,type])
    }
  }
    //IN은 있는데 OUT이 없는 경우 예외 처리
  for(i=0;i<idTimeMap.size;i++){
    const id = Array.from(idTimeMap)[i][0]
    const type=Array.from(idTimeMap)[i][1][1]
    const prevTime=Array.from(idTimeMap)[i][1][0]
    const surplusTime = 23*60+59
    if(type==="IN"){
      idTimeMap.set(id,[surplusTime-prevTime,"OUT"])
    }
  }

    const calculateFee =(map)=>{
     // id값 기준으로 오름차순 정렬
    let array = [...idTimeMap].sort(function(a,b){return a[0]-b[0]})
    
    const freeTime = fees[0] // 무료 시간
    const defaultFee = fees[1] // 기본 요금
    const unitTime = fees[2]// 단위 시간
    const unitFee = fees[3]// 단위 요금
    for(i=0;i<array.length;i++){
      const totalMinute=array[i][1][0]
      const totalPrice = defaultFee+Math.ceil((Math.max(totalMinute-freeTime,0))/unitTime)*unitFee 
      answer.push(totalPrice)
    }
      return answer
  }
  return calculateFee(idTimeMap)

}

 

 

약 한시간 정도 시간이 걸렸다. 크게 어려운 점은 없었고, 문제를 읽고 예외처리를 해주는 데에 신경을 썼다

728x90