52일차

Suhyeon Lee·2024년 12월 12일

CodeKata

SQL

170. Weather Observation Station 20

  • 작성한 쿼리
WITH cte AS (
  SELECT
    id
    , PERCENT_RANK() OVER (ORDER BY lat_n) AS percent
  FROM
    station
)
SELECT
  ROUND(lat_n, 4)
FROM
  station
  JOIN cte
  USING(id)
WHERE
  percent = 0.5
;

※ MySQL에는 median을 구하는 함수 없음

참고할 만한 다른 풀이

SET @idx = -1;

SELECT
  ROUND(AVG(lat_n), 4) AS median
FROM
  (
  SELECT
    @idx := @idx + 1 AS row_num
    , lat_n
  FROM
    sta
  ORDER BY
    lat_n
  ) AS sub
WHERE
  sub.row_num IN (FLOOR(@idx / 2), CEIL(@idx / 2))
;

-- MySQL 8.0 버전부터 순위 관련 함수 지원
SELECT
  ROUND(lat_n, 4)
FROM
  (
  SELECT
    lat_n
    , PERCENT_RANK() OVER (ORDER BY lat_n) AS percent
  FROM
    station
  ) AS sub
WHERE
  sub.percent = 0.5
;
  • 자세한 설명은 여기에서
WITH TEMP AS (SELECT LAT_N, ROW_NUMBER() OVER (ORDER BY LAT_N) AS RNK, COUNT(*) OVER () AS N
              FROM STATION
              )

SELECT ROUND(AVG(LAT_N), 4)
FROM TEMP
WHERE CASE WHEN MOD(N, 2)=1 THEN RNK=(N+1)/2 #주어진 값들의 수가 홀수일 때,
           ELSE RNK IN (N/2, (N/2)+1) #주어진 값들의 수가 짝수일 때
           END
           # where 절에 case clause 사용
;
  • windown function의 rank를 이용해 푸는 방법 > 중간 rank 값을 찾기
    • 주어진 값들의 수가 홀수일 때는 값이 하나지만, 짝수일 때는 두 값의 합에서 2를 나누어주어야 한다.
    • WHERE 절에 CASE을 사용할 수 있다.
  1. ★★★
 WITH TEMP AS (SELECT PERCENT_RANK() OVER (ORDER BY LAT_N) AS RNK, LAT_N
              FROM STATION
             )
SELECT ROUND(AVG(LAT_N), 4)
FROM TEMP
WHERE RNK=0.5
;

→ 이렇게 간단하게 풀 수 있는데 나는 왜 JOIN을 했을까…

171. The Report

  • 작성한 쿼리
SELECT
  CASE
    WHEN grade >= 8 THEN name
    ELSE NULL
  END
  , grade
  , marks
FROM
  students s
  JOIN grades g
  ON marks BETWEEN min_mark AND max_mark
ORDER BY
  grade DESC
  , name
  , marks
;

Python

66. 대충 만든 자판

def solution(keymap, targets):
    answer = []
    
    for word in targets:
        keystroke = 0 # 단어를 만들기 위해 키 몇 번 눌렀는지
        
        for char in word:
            get_targets = False # 단어 만들 수 있는지 여부
            length = 101 # keymap 최대 길이가 100이라서 101 넣음
            
            for key in keymap:
                if char in key:
                    length = min(key.index(char)+1, length)
                    get_targets = True
            
            if not get_targets: # 단어 못 만들면
                keystroke = -1 # 키 누름 -1로 설정
                break
                
            keystroke += length # 알파벳 하나씩 누른 거 합치기
            
        answer.append(keystroke)
            
    return answer

참고할 만한 다른 풀이

def solution(keymap, targets):
    answer = []
    hs = {}
    for k in keymap:
        for i, ch in enumerate(k):
            hs[ch] = min(i + 1, hs[ch]) if ch in hs else i + 1

    for t in targets:
        ret = 0
        for ch in t:
            if ch not in hs:
                ret = - 1
                break
            ret += hs[ch]
        answer.append(ret)

    return answer
def solution(keymap, targets):
    answer = []

    for target in targets:
        c = 0
        for t in target:
            r = min(list(map((lambda x: x.index(t) + 1 if t in x else 102), keymap)))
            if r == 102:
                answer.append(-1)
                break
            else:
                c += r
        if r != 102:
            answer.append(c)          

    return answer

태블로 프로젝트 모아두기

  • 2008년 호드 분석

    • 태블로의 계층 구조화(상단과 하단으로 크게 섹션을 나누어 구성하고 상단에는 주요 지표를 배치)를 잘 보여줌
    • 여러 가지 모양의 그래프를 적절하게 사용
    • 일/주/월로 분석 기간을 나눠 확인 가능한 부분이 좋았음
    • 히스토그램 빈을 직접 조정해 볼 수 있게 한 부분도 참고할 만함
      • 리포트를 읽는 사람이 참여? 조정? 할 수 있는 부분을 넣으면 더 집중할 수 있는 것 같음
  • 2024 League of Legends LEC Player Dashboard

    • 게임 분석은 아니고 선수들 분석인데 깔끔하고 보기 좋아서 참고하면 좋을 것 같음
      • 해당 선수가 플레이한 캐릭터, 획득한 골드, kda 지표 등을 확인할 수 있음
    • 팀별 Gold To Damage Conversion 지표를 만들어서 scatter plot을 보여준 것도 인상적
  • Pokemon Viz

    • Judah (age 8) wanted to know more about all the creatures in Pokemon Go. In this Pokemon Viz, he finds out which is the strongest.
  • The Best Board Game To Try Next (2023 #IronViz Qualifier)

    • 게임은 게임인데 보드게임 분석
    • 신문을 읽는 느낌과 Snakes and ladders 게임을 섞은 느낌의 배치가 인상적
      • 보드게임 좋아한다는 게 느껴짐
    • 게임 분류에 이미지? 이모티콘?을 사용한 것도 좋음
  • Critical Hit - Video Games

    • userscore와 metacritic score를 비교
    • 대시보드를 하나의 게임처럼 만든 것이 인상적
  • World of Warcraft Analysis

    • 실질적으로 해볼 수 있을 만한 대시보드라고 생각
  • World of Warcraft - Competitive 3v3 Arena Ranking Metrics

  • LOL Champion Comparison

회고

  • 경수님이 좋은 강의를 소개해 주셨음!
  • 동민님이 타블로 사례나 팁이 모여있는 사이트 소개해 주셨음
  • 현덕님이 앞으로의 캠프 진행 과정 물어본 거 공유해 주셨음
  1. 태블로 프로젝트의 중점 사항
  • 최우선순위 : 목적 ( 기능 중점 활용 )
  • 차순위 : 가독성 및 꾸미기
    • 추가적 내용 : 태블로에는 금방 적응할 수 있고, 결과는 만들 수 있다. 다만, 어떤 지표를 어떻게 사용할 지에 대한 고민을 많이 해야 한다.
  1. 현재 팀 유지 기간
  • 1월 7일까지 현재 팀으로 진행 예정
  • 최종 프로젝트 발제 후 최종 프로젝트 팀 편성
  1. 실전 프로젝트 종료 후 일정
  • 실전 프로젝트 종료 후 1주 정도 학습 주차 진행 ( 특강 중심 )
  • 원하는 도메인, 원하는 분석 결과물을 탐색하는 시간
  • 같이 하고 싶은 분들과 많은 이야기를 하고, 팀 구성을 위한 노력을 실시
    • 최소 절반은 원하는 분들과 팀이 구성되기를 희망
    • 팀 구성을 못 하신 분들을 따로 팀 배정 예정
profile
2 B R 0 2 B

0개의 댓글