KATA는 기술과 기술 향상에 초점을 맞춘 코드 챌린지입니다.
일부는 프로그래밍 기본 사항을 교육하는 반면 다른 일부는 복잡한 문제 해결에 중점을 둡니다.
이 용어는 The Pragmatic Programmer 라는 책의 공동 저자인 Dave Thomas 가
무술에서 일본의 카타 개념을 인정하면서 처음 만들어졌습니다.
Dave의 개념 버전은 코드 카타를 프로그래머가
연습과 반복을 통해 기술을 연마하는 데 도움이 되는 프로그래밍 연습으로 정의합니다.
Company Table:Lead_Manager Table:
Senior_Manager Table:
Manager Table:
ㅋㅋㅋ문제 길이 뭐야..
✔️ 제출 쿼리
✔️ 쿼리 분석
SELECT C.COMPANY_CODE,
C.FOUNDER,
COUNT(DISTINCT LEAD_MANAGER_CODE),
COUNT(DISTINCT SENIOR_MANAGER_CODE),
COUNT(DISTINCT MANAGER_CODE),
COUNT(DISTINCT EMPLOYEE_CODE)
FROM EMPLOYEE E LEFT JOIN COMPANY C
ON E.COMPANY_CODE=C.COMPANY_CODE
GROUP BY COMPANY_CODE, FOUNDER
ORDER BY COMPANY_CODE
✔️ 제출 코드
✔️ 코드 분석
from collections import deque
def solution(bridge_length, weight, truck_weights):
# 대기 트럭 큐 생성
waiting_trucks = deque(truck_weights)
# 다리 위 트럭 큐 초기화
bridge = deque()
# 경과 시간 초기화
time = 0
# 현재 다리 위 트럭들의 총 무게 초기화
current_bridge_weight = 0
# 대기 트럭이나 다리 위 트럭이 있는 동안 반복
while waiting_trucks or bridge:
time += 1 # 반복 1회마다 1초씩 시간 증가
# 다리를 다 건넌 트럭이 있는지 확인
if bridge and bridge[0][1] == bridge_length:
truck_weight, truck_position = bridge.popleft() # 다리에서 트럭 제거
current_bridge_weight -= truck_weight # 현재 다리 무게에서 제거된 트럭 무게 빼기
# 새로운 트럭이 다리에 올라갈 수 있는지 확인
if waiting_trucks and current_bridge_weight + waiting_trucks[0] <= weight:
truck_weight = waiting_trucks.popleft() # 대기 트럭에서 트럭 하나 제거
bridge.append((truck_weight, 0)) # 다리에 트럭 추가 (무게, 위치 초기화)
current_bridge_weight += truck_weight # 현재 다리 무게에 추가된 트럭 무게 더하기
# 다리 위 모든 트럭의 위치 업데이트
for i in range(len(bridge)):
truck_weight, truck_position = bridge[i]
bridge[i] = (truck_weight, truck_position + 1) # 트럭 위치 1 증가
return time # 모든 트럭이 다리를 건넌 시간 반환
# 쿼리를 있는 그대로 작성했을 경우,
SELECT C.COMPANY_CODE,
C.FOUNDER,
COALESCE(LM.TOTAL_LEAD_MANAGERS, 0) TOTAL_LEAD_MANAGERS,
COALESCE(SM.TOTAL_SENIOR_MANAGERS, 0) TOTAL_SENIOR_MANAGERS,
COALESCE(M.TOTAL_MANAGERS, 0) TOTAL_MANAGERS,
COALESCE(E.TOTAL_EMPLOYEES, 0) TOTAL_EMPLOYEES
FROM COMPANY C LEFT JOIN
(
SELECT COMPANY_CODE,
COUNT(DISTINCT LEAD_MANAGER_CODE) AS TOTAL_LEAD_MANAGERS
FROM LEAD_MANAGER
GROUP BY COMPANY_CODE
) LM ON C.COMPANY_CODE = LM.COMPANY_CODE
LEFT JOIN
(
SELECT COMPANY_CODE,
COUNT(DISTINCT SENIOR_MANAGER_CODE) AS TOTAL_SENIOR_MANAGERS
FROM SENIOR_MANAGER
GROUP BY COMPANY_CODE
) SM ON C.COMPANY_CODE = SM.COMPANY_CODE
LEFT JOIN
(
SELECT COMPANY_CODE,
COUNT(DISTINCT MANAGER_CODE) AS TOTAL_MANAGERS
FROM MANAGER
GROUP BY COMPANY_CODE
) M ON C.COMPANY_CODE = M.COMPANY_CODE
LEFT JOIN
(
SELECT COMPANY_CODE,
COUNT(DISTINCT EMPLOYEE_CODE) AS TOTAL_EMPLOYEES
FROM EMPLOYEE
GROUP BY COMPANY_CODE
) E ON C.COMPANY_CODE = E.COMPANY_CODE
ORDER BY C.COMPANY_CODE
# 전체 테이블을 확인하고 필요한 부분에 LEFT JOIN, GROUP BY 활용
SELECT C.COMPANY_CODE,
C.FOUNDER,
COUNT(DISTINCT LEAD_MANAGER_CODE),
COUNT(DISTINCT SENIOR_MANAGER_CODE),
COUNT(DISTINCT MANAGER_CODE),
COUNT(DISTINCT EMPLOYEE_CODE)
FROM EMPLOYEE E LEFT JOIN COMPANY C
ON E.COMPANY_CODE=C.COMPANY_CODE
GROUP BY COMPANY_CODE, FOUNDER
ORDER BY COMPANY_CODE
deque()
활용하기from collections import deque
def solution(bridge_length, weight, truck_weights):
# 대기 트럭 큐 생성
waiting_trucks = deque(truck_weights)
# 다리 위 트럭 큐 초기화
bridge = deque()
# 경과 시간 초기화
time = 0
# 현재 다리 위 트럭들의 총 무게 초기화
current_bridge_weight = 0
# 대기 트럭이나 다리 위 트럭이 있는 동안 반복
while waiting_trucks or bridge:
time += 1 # 반복 1회마다 1초씩 시간 증가
# 다리를 다 건넌 트럭이 있는지 확인
if bridge and bridge[0][1] == bridge_length:
truck_weight, truck_position = bridge.popleft() # 다리에서 트럭 제거
current_bridge_weight -= truck_weight # 현재 다리 무게에서 제거된 트럭 무게 빼기
# 새로운 트럭이 다리에 올라갈 수 있는지 확인
if waiting_trucks and current_bridge_weight + waiting_trucks[0] <= weight:
truck_weight = waiting_trucks.popleft() # 대기 트럭에서 트럭 하나 제거
bridge.append((truck_weight, 0)) # 다리에 트럭 추가 (무게, 위치 초기화)
current_bridge_weight += truck_weight # 현재 다리 무게에 추가된 트럭 무게 더하기
# 다리 위 모든 트럭의 위치 업데이트
for i in range(len(bridge)):
truck_weight, truck_position = bridge[i]
bridge[i] = (truck_weight, truck_position + 1) # 트럭 위치 1 증가
return time # 모든 트럭이 다리를 건넌 시간 반환