Study & Project ✏️/프로그래머스 PCCP 공부 📅

[프로그래머스] Array 자료구조 복습 및 실습문제(주차 요금 계산) 풀이 - 파이썬

JM 2022. 11. 9. 02:52
반응형

📖 문제

 

📃 코드

import math
# fees = [120, 0, 60, 591]
# records = ["16:00 3961 IN","16:00 0202 IN","18:00 3961 OUT","18:00 0202 OUT","23:58 3961 IN"]
# result = [0, 591]

def solution(fees, records):
    answer = []
    inTime = [0] * 10000
    isIn = [0] * 10000
    sumT = [0] * 10000

    for record in records:
        a, b, c = record.split()
        H, M = a.split(":")
        if c == "IN":
            # record for initTime -> inTime[3961] = H*60 + M
            inTime[int(b)] = int(H)*60 + int(M)
            isIn[int(b)] = 1
        else:
            # record for sumTime -> sumT[3961] = inTime[3961] - H*60 + M
            # IMPORTANT append time for twice input
            sumT[int(b)] += int(H)*60 + int(M) - inTime[int(b)]
            isIn[int(b)] = 0

    for i in range(10000):
        # there is no output vehicle
        if isIn[i] > 0:
            sumT[i] += 23*60+59 - inTime[i]
            isIn[i] = 0

    for i in range(10000):
        if sumT[i] > 0:
            # math.ceil((sumT[i] - fees[0])/fees[2]) can be negative, so compare with 0
            answer.append(fees[1] + max(math.ceil((sumT[i] - fees[0])/fees[2]), 0)*591)
    return answer


fees = [120, 0, 60, 591]
records = ["16:00 3961 IN", "16:00 0202 IN",
           "18:00 3961 OUT", "18:00 0202 OUT", "23:58 3961 IN"]
print(solution(fees, records))

✔️ 복습

import math
def solution(fees, records):
    answer = []
    inTime = [0 for _ in range(10000)]
    isIn = [0 for _ in range(10000)]
    sumTime = [0 for _ in range(10000)]
    
    for record in records:
        time, number, state = record.split(" ")
        H, M = time.split(":")
        if state == "IN":
            inTime[int(number)] = int(H)*60+int(M)
            isIn[int(number)] = 1
        else:
            sumTime[int(number)] += (int(H)*60+int(M)) - inTime[int(number)]
            isIn[int(number)] = 0
            
    for i in range(10000):
        if isIn[i] == 1:
            sumTime[i] += (23*60+59) - inTime[i]
            
    for i in range(10000):
        if sumTime[i] > 0:
            answer.append(fees[1] + max(math.ceil((sumTime[i]-fees[0])/fees[2]),0)*fees[3])
    
    return answer

 

🗝️ 요약

[개념]

파이썬에서는 배열을 list로 사용한다.

split()을 적극 활용해서 값을 편집하자.

[활용]
고유한 data에 대해서 여러 값을 처리하고 싶다면 배열을 사용하면 된다.

고유한 data기 때문에 index를 data로 사용하면 된다.

boolean값을 사용할 수 있게 똑같은 크기의 배열을 사용할 수도 있다.