KATA#74

codataffee·2024년 6월 27일
0

CODEKATA

목록 보기
74/114
post-thumbnail

WHAT IS KATA?

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

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


- SQL


✔️ 문제 #1: New Companies


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


- PYTHON


✔️ 문제 #1: 다리를 지나는 트럭

✔️ 제출 코드

✔️ 코드 분석

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  # 모든 트럭이 다리를 건넌 시간 반환


✔️ CHECK POINT

  • SQL
    • 테이블을 잘 확인하고 이해하면, 복잡하게 풀어야 하는 문제도
      나름 쉽게 풀 수 있다는 것을 배웠다.
# 쿼리를 있는 그대로 작성했을 경우,
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

  • PYTHON
    • 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  # 모든 트럭이 다리를 건넌 시간 반환

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

0개의 댓글

관련 채용 정보