66일차

Suhyeon Lee·2025년 1월 3일

CodeKata

SQL

프로그래머스: 연간 평가점수에 해당하는 평가 등급 및 성과금 조회하기

  • 작성한 쿼리
SELECT
  he.emp_no
  , emp_name
  , CASE
    WHEN AVG(score) >= 96 THEN 'S'
    WHEN AVG(score) >= 90 THEN 'A'
    WHEN AVG(score) >= 80 THEN 'B'
    ELSE 'C'
  END AS grade
  , CASE
    WHEN AVG(score) >= 96 THEN ROUND(sal * 0.2)
    WHEN AVG(score) >= 90 THEN ROUND(sal * 0.15)
    WHEN AVG(score) >= 80 THEN ROUND(sal * 0.1)
    ELSE 0
  END AS bonus
FROM
  hr_employees he
  JOIN hr_grade hg
  USING(emp_no)
GROUP BY
  he.emp_no
ORDER BY
  he.emp_no
;

참고할 만한 다른 풀이

  • 내가 푼 풀이는 여러 번 AVG(score)가 실행됨
    • 한 번의 계산을 재사용하도록 바꾸면 더 효율적
      (여러 번 사용되는 데이터가 필요할 때는 가상 테이블을 사용하는 게 좀 더 효율적)
WITH average_score AS (
  SELECT
    emp_no
    , AVG(score) AS avg_score
  FROM
    hr_grade
  GROUP BY
    emp_no
)
SELECT
  e.emp_no
  , emp_name
  , (CASE
    WHEN avg_score >= 96 THEN 'S'
    WHEN avg_score >= 90 THEN 'A'
    WHEN avg_score >= 80 THEN 'B'
    ELSE 'C'
  END) AS grade
  , SAL * (CASE
    WHEN avg_score >= 96 THEN 0.2
    WHEN avg_score >= 90 THEN 0.15
    WHEN avg_score >= 80 THEN 0.1
    ELSE 0 
  END) AS bonus
FROM
  hr_employees e
  JOIN average_score a
  USING(emp_no)
GROUP BY
  e.emp_no
ORDER BY
  e.emp_no
;
  • with절 사용
with GRADE as (
            select EMP_NO,
             (case when avg(SCORE) >= 96 then 'S'
                        when avg(SCORE) >= 90 then 'A'
                        when avg(SCORE) >= 80 then 'B'
                        else 'C' end ) as GRADE,
            (case when avg(SCORE) >= 96 then 0.2
                                when avg(SCORE) >= 90 then 0.15
                                when avg(SCORE) >= 80 then 0.1
                                else 0 end ) as BONUS
            from HR_GRADE
            group by EMP_NO)

select e.EMP_NO, e.EMP_NAME, g.GRADE, g.BONUS * e.SAL as BONUS
from HR_EMPLOYEES e join GRADE g on e.EMP_NO = g.EMP_NO 
order by e.EMP_NO asc;

Python

74. 신고 결과 받기

  • 작성한 코드
def solution(id_list, report, k):
    answer = []
    # 중복 신고 제거
    report_unique = list(set(report))
    # id 신고 당한 횟수 저장용 dict
    id_dict = {x:0 for x in id_list}
    # k번 이상 신고당한 이용자용 list
    gotcha = []
    
    for i in report_unique:
        # 신고 당한 id 카운트
        id_dict[i.split(' ')[1]] += 1
    
    for i in report_unique:
        get_id = i.split(' ')
        if id_dict[get_id[1]] >= k: # k번 이상 신고당한 id였을 경우
            gotcha.append(get_id[0]) # 결과 메일을 위해 신고자 id 추가
    
    for get_mail in id_list:
        answer.append(gotcha.count(get_mail)) # 메일 개수 카운트
        
    return answer

참고할 만한 다른 풀이

def solution(id_list, report, k):
    answer = [0] * len(id_list)    
    reports = {x : 0 for x in id_list}

    for r in set(report):
        reports[r.split()[1]] += 1

    for r in set(report):
        if reports[r.split()[1]] >= k:
            answer[id_list.index(r.split()[0])] += 1

    return answer
from collections import defaultdict

def solution(id_list, report,k):
    answer = []
    # 중복 신고 제거
    report = list(set(report))
    # user별 신고한 id 저장
    user = defaultdict(set)
    # user별 신고당한 횟수 저장
    cnt = defaultdict(int)
	
    for r in report:
        # report의 첫번째 값은 신고자id, 두번째 값은 신고당한 id
        a,b = r.split()
        # 신고자가 신고한 id 추가
        user[a].add(b)
        # 신고당한 id의 신고 횟수 추가
        cnt[b] += 1
    
    for i in id_list:
        result = 0
        # user가 신고한 id가 k번 이상 신고 당했으면, 받을 메일 추가
        for u in user[i]:
            if cnt[u]>=k:
                result +=1
        answer.append(result)
    return answer

특강

데이터 수집 2회차
셀레니움 잘못 사용하다가
자기 IP로 웹사이트 접속 차단당하는 거 자주 봤어요.

QCC 5회차 대비

1회차 다시 풀어보기
2회차 다시 풀어보기
3회차 다시 풀어보기
4회차 다시 풀어보기

QCC 5회차

5회차

보충 학습

window function과 join

최종 프로젝트 관련

이터널 리턴 드라이브(이미지 파일)

회고

  • QCC 정말 재밌었다~ 만점 받지는 못했지만 푸는 즐거움이 있는 문제들이어서 매우 만족
  • 주말에 API 호출 파헤치기!
profile
2 B R 0 2 B

0개의 댓글