Early Riser
생각정리
Early Riser
전체 방문자
오늘
어제
  • 분류 전체보기 (128)
    • JS (19)
    • React (33)
    • React Native (2)
    • Library, Tool (13)
    • CSS (2)
    • Algorithm (40)
    • Computer Science (3)
    • 회고 (3)
    • AI (13)

블로그 메뉴

  • 홈
  • 태그
  • 방명록
  • 글쓰기

공지사항

인기 글

태그

  • 부스트캠프 합격 후기
  • 알고리즘
  • 논문리뷰
  • 손실함수
  • useState
  • 오늘의불경
  • LGBM
  • 백준
  • 부스트캠프 합격
  • useEffect
  • 딥러닝
  • js
  • react
  • 프로그래머스
  • RNN
  • javascript
  • global minima
  • 밑바닥
  • 비동기
  • boosting
  • 백트래킹
  • 구현
  • 자바스크립트
  • dfs
  • BFS
  • 파이썬
  • 완전탐색
  • lightgbm
  • local minima
  • 부스트캠프 9기

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
Early Riser

생각정리

프로그래머스: 주차 요금 계산 (파이썬, 구현)
Algorithm

프로그래머스: 주차 요금 계산 (파이썬, 구현)

2022. 12. 20. 16:56

문제 자체는 어렵지 않았는데 구현에 시간이 좀 걸리는 문제였다.. 푸는데 40분정도 걸린 것 같다.

시간과 번호판의 자리수가 정해져 있기에 파이썬의 list indexing과 sort함수를 이용하면 쉽게 풀 수 있는 문제였다.

 

먼저 문제에서 봐야할 조건은 크게 두가지 였던것 같다.

첫째로 누적 주차시간을 계산하여 요금을 일괄로 정산한다는 점,

둘째로 입차 후 당일에 출차를 안할 시 23:59분에 출차로 계산한다는 점이다.

셋째로 차량 번호가 작은 자동차부터 주차요금을 배열에 담아 return해야 한다는 점이다.

 

이 세가지 조건을 토대로 차량번호별로 주차시간을 계산해야하고, 미리 번호판, 시간순으로 정렬이 필요하겠다는 생각을 하였다.

 

번호판, 시, 분 순으로 정렬한다면 in, out조건을 신경쓸 필요 없어 구현이 더 쉬워진다는 장점이 있다. 왜냐하면 번호판 순으로 정렬했기에 i번째 차와 i+1번째 차의 번호판이 같다면 그 둘은 각각 in, out일 것이기 때문이다.

만약 i번째 차와 i+1번째 차의 번호판이 다르다면 i번째 차는 입차만 한 차이므로 23:59에 나간 것으로 계산하면 된다. 

 

또한 정렬된 채로 hash를 초기화 시키기에 누적 주차 시간을 계산 후 hash의 key순서대로 value들을 불러오면 그 key들은 차량 번호가 작은 순임이 보장되므로 추후 주차 요금을 계산할 때도 편하다.

import math


def solution(fees, records):
    answer = []
    dic = {}
    # 번호판, 시, 분 순으로 정렬
    records.sort(key=lambda x:(x[6:11], x[0:2], x[3:5]))
    # dictionary 초기화
    for record in records:
        dic[record[6:11]] = 0
    i = 0
    while i < len(records):
        # records 길이가 홀수일 경우 i와 i+1을 비교할 수 없고, i==len(records)-1이면 배열의 마지막 원소이므로 입차만 한 차
        if i == len(records)-1:
            time = (59 - int(records[i][3:5])) + (23 - int(records[i][0:2])) * 60
            if time <= fees[0]:
                dic[records[i][6:11]] += time
            else:
                dic[records[i][6:11]] += time
            break
        # 번호판 순으로 정렬했으므로 i와 i+1의 번호판이 같다면 각각 in, out이다.
        if records[i][6:11] == records[i+1][6:11]:
            time = (int(records[i+1][3:5])-int(records[i][3:5]))+(int(records[i+1][0:2])-int(records[i][0:2]))*60
            if time <= fees[0]:
                dic[records[i][6:11]] += time
            else:
                dic[records[i][6:11]] += time
            i += 2
        # i와 i+1의 번호판이 다르다면 i번째 차는 입차만 한 차이다. 따라서 23:59분에 출차한 것으로 계산한다.
        else:
            time = (59-int(records[i][3:5]))+(23-int(records[i][0:2]))*60
            if time <= fees[0]:
                dic[records[i][6:11]] += time
            else:
                dic[records[i][6:11]] += time
            i += 1

    for key in list(dic.keys()):
        if dic[key] <= fees[0]:
            answer.append(fees[1])
        else:
            answer.append((fees[1]+math.ceil((dic[key]-fees[0])/fees[2])*fees[3]))
    return answer

 

'Algorithm' 카테고리의 다른 글

백준 14502번: 연구소 (javascript, DFS)  (0) 2023.03.28
백준 2870번: 수학숙제 (javascript, 구현)  (0) 2023.03.25
프로그래머스: [3차] 압축 (파이썬, 구현)  (0) 2022.12.20
프로그래머스: k진수에서 소수 개수 구하기 (파이썬, 구현)  (0) 2022.12.19
프로그래머스: n^2 배열 자르기 (파이썬, 구현)  (0) 2022.12.19
    'Algorithm' 카테고리의 다른 글
    • 백준 14502번: 연구소 (javascript, DFS)
    • 백준 2870번: 수학숙제 (javascript, 구현)
    • 프로그래머스: [3차] 압축 (파이썬, 구현)
    • 프로그래머스: k진수에서 소수 개수 구하기 (파이썬, 구현)
    Early Riser
    Early Riser
    2년차 프론트엔드 개발자입니다. https://github.com/EarlyRiser42

    티스토리툴바