일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 이미지 데이터 타입
- animation
- camera permission
- Recoil
- react-native
- silent printing
- react-native-dotenv
- 티스토리 성능
- device in use
- Git
- electron-packager
- github pdf
- Can't resolve
- ELECTRON
- npm package
- Each child in a list should have a unique "key" prop.
- adb connect
- dvh
- vercel git lfs
- camera access
- nextjs
- rolldown
- augmentedDevice
- Failed to compiled
- adb pair
- html
- custom printing
- github 100mb
- github lfs
- ffi-napi
- Today
- Total
Bleeding edge
[프로그래머스] 주차 요금 계산 - 자바스크립트 본문
30분정도 걸려서 푼거같다. 문제를 제대로 읽었다면 25분 걸렸을꺼 같다
https://programmers.co.kr/learn/courses/30/lessons/92341
문제의 풀이 플로우는 다음과같이 짰다.
1. 차의 내역을 기록하는, new Map()을 만든다.
2. 차의 출입내역을 for문으로 돌린다.
3. 출입내역의 state가 IN일 때
--1]만일, 차 입장 내역이 없다면(map.get으로 체크)
----[입장시간||out상태, 0] value로 입력한다
--2]만일 값이 있다고하면,
----[입장시간||out상태, 현재까지 이용한시간]로 value를 입력한다
출입내역의 state가 OUT일 때
--나가는시간 - 입장한시간의 값과 현재까지 이용한 시간의 합을, 현재까지 이용한 시간에 넣는다.
이때 주의할 것은, 입장한 시간의 경우에는 Number화 시켜서 h*60 + m을 계산하여아하니, 이것을 계산해서 대입
4. 나간 기록이 없으면 23:59분에 나간 것으로 처리하기위해 for문을 한번 더 돌리면서 만일 value의 입장시간이 out이 아니라고하면, 23:59분으로 다시한번 3번과정을 반복한다.
5. 주차요금 계산을 하기 위하여, value값을 기본요금 + (이용시간-기본시간)/단위시간*기본시간으로 계산한다. 이때 주의할 것은, 이용시간이 기본시간보다 작다고하면, value는 기본요금이 되고, (이용시간-기본시간)/단위시간이, 나누어 떨어지지 않으면 Math.ceil로 올린다.
6. list를 Array.from화 시킨뒤 0번째 값을 기준으로 sort시킨다(차번 오름차순으로 정렬)
7. map v[1]로 마무리를 한뒤 return한다.
function solution(fees, records) {
const [basicT,basicM, scaleT,scaleM] =fees
let list = new Map()
for(let i=0;i<records.length;i++){
const [time, car, state] = records[i].split(" ")
if(state==="IN"){
if(!list.get(car)){
list.set(car, [time, 0])
}else{
const [lasttime, savetime] = list.get(car)
list.set(car, [time, savetime])
}
}else if(state==="OUT"){
const [lasttime, savetime] = list.get(car)
list.set(car, ['out', savetime+tc(time)-tc(lasttime)])
}
}
for(let key of list.keys()){
const [lasttime, savetime] = list.get(key)
if(lasttime!=='out'){
list.set(key, ['out', savetime+tc('23:59')-tc(lasttime)])
}
}
let answer = Array.from(list)
for(let i=0;i<answer.length;i++){
if(answer[i][1][1]<=basicT){
answer[i][1] =basicM
}else{
answer[i][1]=basicM + Math.ceil((answer[i][1][1]-basicT)/scaleT)*scaleM
}
}
answer = answer.sort((a,b)=>a[0]-b[0])
answer = answer.map((v)=>v[1])
return answer
}
function tc(time){
const [h, m] = String(time).split(":");
return Number(h)*60+Number(m)
}
사실 오래전에 풀어본 기억이 있는 문제이다. 그때는 참 어렵게 시도하다가 실패했었는데, 지금은, new Map()을 이용할 수 있게되었고, const [a, b] = list와 같은 것을 잘 사용하게 되어서, 문제를 정리되게 잘 푼거같다. 그리고, 습관적으로 typeof가 string일지라도 String을 시키는 것과 같은 것으로 타입을 정리하여 값을 분명히 하는 게 조금씩 보이면서 풀이를 하는 것이 개선되고 있는 것이 느껴졌다.
'코딩테스트 공부' 카테고리의 다른 글
조합 nCr 구하기. (0) | 2022.05.12 |
---|---|
[프로그래머스] [3차] n진수 게임 - 자바스크립트 (0) | 2022.05.10 |
[프로그래머스] JadenCase 문자열 만들기 - 자바스크립트 (0) | 2022.05.10 |
[프로그래머스] [3차] 압축- 자바스크립트 (0) | 2022.05.06 |
[프로그래머스] n^2 배열 자르기 - 자바스크립 (0) | 2022.05.03 |