KATA#69

codataffee·2024년 6월 21일
0

CODEKATA

목록 보기
69/114
post-thumbnail

WHAT IS KATA?

KATA는 기술과 기술 향상에 초점을 맞춘 코드 챌린지입니다.
일부는 프로그래밍 기본 사항을 교육하는 반면 다른 일부는 복잡한 문제 해결에 중점을 둡니다.

이 용어는 The Pragmatic Programmer 라는 책의 공동 저자인 Dave Thomas 가
무술에서 일본의 카타 개념을 인정하면서 처음 만들어졌습니다.
Dave의 개념 버전은 코드 카타를 프로그래머가
연습과 반복을 통해 기술을 연마하는 데 도움이 되는 프로그래밍 연습으로 정의합니다.


- SQL


✔️ 문제 #1: Weather Observation Station 14

✔️ 제출 쿼리

✔️ 쿼리 분석

# 가장 큰 LAT_N 값의 소수점 4자리까지 잘라서 반환
# MAX(LAT_N)으로 찾은 최대 LAT_N 값을 소수점 이하 4자리까지
SELECT TRUNCATE(MAX(LAT_N), 4)
FROM STATION
#LAT_N 값이 137.2345보다 작은 레코드들만 선택
WHERE LAT_N < 137.2345


- PYTHON


✔️ 문제 #1: 주차 요금 계산

✔️ 제출 코드

✔️ 코드 분석

# 문제 단계 정리
# 1 : 입차와 출차 시각을 분 단위로 변환
# 2 : 각 차량의 총 주차 시간 계산
# 3 : 요금 계산
# 4 : 차량 번호 순으로 결과 정렬

import math
from collections import defaultdict

# 시간을 "HH:MM" 형식에서 분 단위로 변환하는 함수
def convert_to_minutes(time_str):
    hh, mm = map(int, time_str.split(':'))
    return hh * 60 + mm

# 요금 계산하는 함수
def calculate_fee(time, fees):
    basic_time, basic_fee, unit_time, unit_fee = fees
    # 기본 시간을 초과하지 않으면 기본 요금 부과
    if time <= basic_time:
        return basic_fee
    else:
        # 초과한 시간 계산
        extra_time = time - basic_time
        # 초과한 시간을 단위 시간으로 나누고 올림하여 단위 요금 계산
        extra_fee = math.ceil(extra_time / unit_time) * unit_fee
        # 기본 요금에 초과 요금을 더하여 총 요금 반환
        return basic_fee + extra_fee

# 주어진 요금표와 입출차 기록으로 주차 요금을 계산하는 함수
def solution(fees, records):
    parking_times = defaultdict(int)  # 차량별 누적 주차 시간을 저장할 딕셔너리
    in_times = {}  # 차량별 입차 시간을 저장할 딕셔너리
    
    # 모든 입출차 기록 정리
    for record in records:
        time, car_number, action = record.split()
        # 시간을 전부 분 단위로 변환
        time = convert_to_minutes(time)
        
        if action == "IN":
            in_times[car_number] = time  # 입차 시간 기록
        elif action == "OUT":
            in_time = in_times.pop(car_number)  # 입차 시간 가져오기
            parking_times[car_number] += time - in_time  # 누적 주차 시간 계산
    
    # 출차되지 않은 차량은 23:59에 출차된 것으로 간주
    end_of_day = convert_to_minutes("23:59")
    for car_number, in_time in in_times.items():
        parking_times[car_number] += end_of_day - in_time
    
    # 차량 번호 기준으로 요금 계산
    result = []
    for car_number in sorted(parking_times):
        fee = calculate_fee(parking_times[car_number], fees)
        result.append(fee)
    
    return result


✔️ CHECK POINT

  • SQL

    • MAXTRUNCATE 함수 활용
      # 가장 큰 LAT_N 값의 소수점 4자리까지 잘라서 반환
      # MAX(LAT_N)으로 찾은 최대 LAT_N 값을 소수점 이하 4자리까지
      SELECT TRUNCATE(MAX(LAT_N), 4)
      FROM STATION
      #LAT_N 값이 137.2345보다 작은 레코드들만 선택
      WHERE LAT_N < 137.2345
  • PYTHON

    • defaultdict는 기본값을 가지는 딕셔너리로,
      키가 존재하지 않는 경우에도 자동으로 기본값을 반환하여
      코드에서 추가적인 존재 여부 확인과 초기화를 할 필요가 없다.
      # 일반 딕셔너리 사용
      parking_times = {}
      # 입차 시간 기록 및 누적 주차 시간 계산
      for car_number in car_numbers:
      	if car_number not in parking_times:
       		parking_times[car_number] = 0
          parking_times[car_number] += time_spent
       
       # defaultdict 사용
      from collections import defaultdict
      # defaultdict를 사용하여 기본값이 0인 딕셔너리 생성
      parking_times = defaultdict(int)
      # 입차 시간 기록 및 누적 주차 시간 계산
      for car_number in car_numbers:
      	parking_times[car_number] += time_spent
    • 00:00 시간 형식을 분으로 변환하기
      # 시간을 "HH:MM" 형식에서 분 단위로 변환하는 함수
      def convert_to_minutes(time_str):
      	hh, mm = map(int, time_str.split(':'))
      	return hh * 60 + mm

profile
커피 좋아하는 데이터 꿈나무

0개의 댓글

관련 채용 정보