2024-11-02

Suhyeon Lee·2024년 11월 2일
0

자기주도학습

목록 보기
43/83

CodeKata

SQL

89. Managers with at Least 5 Direct Reports

  • 작성한 쿼리
WITH rpt_cnt AS (
  SELECT
    managerID AS manager_id
    , IFNULL(COUNT(managerId), 0) AS cnt
  FROM
    employee
  GROUP BY
    managerId
)
SELECT
  name
FROM
  employee e
  JOIN rpt_cnt r
  ON e.id = r.manager_id
WHERE
  cnt >= 5
;

→having 쓰면 더 간단하게 풀림

SELECT
  e1.name
FROM
  employee e1
  JOIN employee e2
  ON e1.id = e2.managerId
GROUP BY
  e1.id
HAVING
  COUNT(e2.managerId) >= 5  
;

COUNT(*), COUNT(e2.name)도 가능

참고할 만한 다른 풀이

  • 인라인 서브쿼리
SELECT E1.name
FROM Employee E1
JOIN (
    SELECT managerId, COUNT(*) AS directReports
    FROM Employee
    GROUP BY managerId
    HAVING COUNT(*) >= 5
) E2 ON E1.id = E2.managerId;
  • 중첩 서브쿼리
SELECT name 
FROM Employee 
WHERE id IN (
    SELECT managerId 
    FROM Employee 
    GROUP BY managerId 
    HAVING COUNT(*) >= 5)

Python

29. 제일 작은 수 제거하기

  • 작성한 코드
def solution(arr):
    answer = []
    if len(arr) == 1:
        answer.append(-1)
    else:
        answer = arr
        answer.remove(min(arr))
    return answer

→ min() 함수를 안 쓰고 풀고 싶어졌음

def solution(arr):
    answer = []
    if len(arr) == 1:
        answer.append(-1)
    else:
        element_min=arr[0]
        for i in arr:
            if element_min>i:
                element_min=i
        answer = arr
        answer.remove(element_min)
    return answer

→ arr에 가장 작은 수가 중복으로 있는 경우와 arr가 빈 배열인 경우(문제에서는 배열 길이가 1 이상이라고 했기 때문에 사실 고려하지 않아도 되긴 함)도 고려해고 싶어졌음!

def solution(arr):
    answer = []
    if len(arr) == 1 or len(arr) == 0:
        answer.append(-1)
    else:
        element_min=min(arr)
        for i in arr:
            if i>element_min:
                answer.append(i)
    return answer

참고할 만한 다른 풀이

  • pop()
def solution(arr):
    arr.pop(arr.index(min(arr)))
    return arr

→ pop을 이렇게 쓰면 메모리 낭비라는 코멘트 있었음

  • list comprehension
def rm_small(mylist):
    return [i for i in mylist if i > min(mylist)] or [-1]

→ 리스트의 길이만큼 min 함수를 반복 실행하기 때문에 굉장히 비효율적인 코드라고 함(시간복잡도가 O(N*N))
→ 왜? min을 하면 최소값을 찾기 위해, 자체적으로 for문을 돌기 때문!

회고

  • 내일 ADsP 시험이라 코드카타만 하고 나머지 시간은 ADsP 강의랑 기출문제 풀었음
  • 알고리즘은 확실히 시간복잡도까지 생각해야 하는구나
    • 대학교 수업 중에 자료구조와 알고리즘 과목 들으면 좋다고 함 → 무료 강의 있는지 찾아보기
profile
2 B R 0 2 B

0개의 댓글

관련 채용 정보