KATA는 기술과 기술 향상에 초점을 맞춘 코드 챌린지입니다.
일부는 프로그래밍 기본 사항을 교육하는 반면 다른 일부는 복잡한 문제 해결에 중점을 둡니다.
이 용어는 The Pragmatic Programmer 라는 책의 공동 저자인 Dave Thomas 가
무술에서 일본의 카타 개념을 인정하면서 처음 만들어졌습니다.
Dave의 개념 버전은 코드 카타를 프로그래머가
연습과 반복을 통해 기술을 연마하는 데 도움이 되는 프로그래밍 연습으로 정의합니다.
✔️ 제출 쿼리
✔️ 쿼리 분석
# 가장 큰 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
✔️ 제출 코드
✔️ 코드 분석
# 문제 단계 정리
# 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
SQL
MAX
와 TRUNCATE
함수 활용# 가장 큰 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