CodeKata
SQL
175. Contest Leaderboard
SELECT
hacker_id
, name
, SUM(max_score) AS total_score
FROM
(
SELECT
s.hacker_id
, name
, challenge_id
, MAX(score) AS max_score
FROM
submissions s
JOIN hackers h
USING(hacker_id)
GROUP BY
s.hacker_id
, name
, challenge_id
) a
GROUP BY
hacker_id
, name
HAVING
SUM(max_score) <> 0
ORDER BY
SUM(max_score) DESC
, hacker_id
;
→ 원래 WITH 구문 썼는데 제출이 안 돼서 서브쿼리로 바꿈
(해커 랭크에서는 버전 문제로 with절 사용 시 쿼리 실행이 안 될 때가 있다고 함)
Python
68. 햄버거 만들기
def solution(ingredient):
answer = 0
make_burger = [1, 2, 3, 1]
stack = []
for i in ingredient:
stack.append(i)
if len(stack) < 4:
continue
if stack[-4:] == make_burger:
answer += 1
for _ in range(4):
stack.pop()
return answer
참고할 만한 다른 풀이
def solution(ingredient):
temp = []
cnt = 0
for i in ingredient:
temp.append(i)
if temp[-4:] == [1, 2, 3, 1]:
cnt += 1
for n in range(4):
temp.pop()
return cnt
def solution(ingredient):
ing = []
cnt = 0
for i in ingredient:
ing.append(i)
if ing[-4:] == [1, 2, 3, 1]:
cnt += 1
del ing[-4:]
return cnt
-- 1
def solution(ingredient):
ingredient = "".join(list(map(str, ingredient)))
if len(ingredient) < 4:
return 0
stack = ingredient[:3]
count = 0
for v in ingredient[3:]:
stack += v
if stack[-4:] == "1231":
stack = stack[:-4]
count += 1
return count
-- 2
def solution(ingredient):
s = ''.join(list(map(str, ingredient)))
answer = 0
while '1231' in s:
if s.find('1231') >= 4:
s = s[s.find('1231')-4:]
s = s.replace('1231','',1)
answer += 1
return answer
태블로
매개변수와 계산된 필드
참고
매개변수
- 계산, 필터, 참조 등에서 상수값으로 대체할 수 있는 숫자/날짜/문자열 등과 같은 통합 문서 변수
- 예: 카페인 용량 80mg으로 지정한 용량에 따라 색상을 표현하는데 용량을 80mg이 아니라 100mg 기준으로 보고 싶을 때 아래와 같은 문제를 해결하는 방법 중 하나
- 매번 계산식을 수정해야 할까?
- 편집 권한이 없고 조회만 가능한 사용자를 위해서는 어떻게 해야 할까?
→ 10 - 100까지 범위의 매개변수를 써 주면 사용자가 원하는 용량 기준으로 유연하게 변경 가능
예시
측정값을 칼로리/카페인/당류 선택 가능하도록 하고, 선택한 카페인 함유량에 따라 카테고리 색상이 표시되도록 해 주세요
-
측정값 선택을 위한 매개변수 생성

- 이름: 측정값 선택
- 데이터 유형: 문자열
- 허용 가능한 값: 목록
- 값 목록: 칼로리, 카페인, 당류

-
위에서 만든 매개변수를 이용하는 '계산된 필드' 생성
- [측정값 선택] 매개변수에서 선택에 따라 측정값 가져오도록 계산식 작성

- '칼로리' 선택 시 [칼로리] 측정값 가져오기
- '카페인' 선택 시 [카페인] 측정값 가져오기
- '당류' 선택 시 [당류] 측정값 가져오기
-
매개변수를 표시 후, 카테고리별(열) 선택한 측정값(행) 배치
- 측정값 선택에 따라 막대차트의 데이터가 변경됨


-
카페인 함유량별 색상 변경을 위해 또 다른 매개 변수 생성
- 이름: 카페인 함유량 선택
- 데이터 유형: 정수
- 허용 가능한 값: 범위
- 값 범위: 최소값 0, 최대값 200, 단계 크기 20

-
마찬가지로 매개 변수를 활용하는 계산된 필드 생성

-
카페인 함유량 선택 매개 변수를 표시하고, 선택한 카페인 필드를 마크 색상에 두면 카페인 항유량 선택 수치 변경에 따라 색상이 변경됨


-
시트 제목에 매개 변수를 삽입하여 [측정값 선택] 값에 따라서 제목이 변경되도록 설정

- 선택한 측정값에 따라 시트 제목 또한 변경됨

선택한 측정값에 따라서 두 측정값의 상관 관계를 살펴보는 동적 시각화를 만들어 보세요.
-
첫 번째 매개 변수
- 이름: X축 선택
- 데이터 유형: 문자열
- 허용 가능한 값: 목록
- 값 목록: 카페인, 칼로리, 나트륨, 당류
-
두 번째 매개 변수
- 이름: Y축 선택
- 데이터 유형: 문자열
- 허용 가능한 값: 목록
- 값 목록: 카페인, 칼로리, 나트륨, 당류
-
첫 번째 매개 변수를 위한 계산된 필드
-
두 번째 매개 변수를 위한 계산된 필드

→ X,Y축 각각 측정값을 선택할 수 있고, 선택한 측정값들의 상관관계를 나타낸다. (시트명도 매개변수 적용)
평균라인 추가 및 마크모양/색상/투명도를 통해 가독성을 높여주도록 하자.

세부 수준(LOD) 표현식의 이해
참고
LOD 표현식의 작동 방법: '세부 수준' 설명
- 데이터 탐색의 핵심: 원본의 구조를 이해하는 것
- 다음과 같은 질문에 대한 답변을 찾을 수 있도록 세부 수준(LOD) 표현식이라는 새로운 구문이 도입됨
- 분기별로 회사의 주문이 100개 이상이었던 일 수를 파악하고 싶어요
- 영업 담당자별로 성사된 거래 중 규모가 가장 큰 거래를 찾고 관리자별 평균을 파악하고 싶어요
- 각 고객에게 처음 고객이 된 연도를 태그로 지정한 다음, 해당 태그를 사용하여 매출을 그룹화 하고 싶어요
- 예: 가장 세부적인 수준이 주소별로 나열된 레스토랑 검사 데이터가 있을 때 데이터를 집계하여 우편 번호, 구/군/시, 시/도 또는 국가별로 속성을 확인
- Tableau에서는 원하는 차원(예: 구/군/시, 시/도)을 뷰에 드롭해 이러한 작업을 수행할 수 있음
- 뷰에 추가한 차원에 따라 데이터가 '비쥬얼라이제이션 세부 수준', 즉 비쥬얼라이제이션 LOD로 집계됨

- 하이라이트 된 선반에 차원을 배치하면 비쥬얼라이제이션 LOD에 추가됨
- 차원을 페이지, 필터 및 도구 설명 선반에 배치하면 비쥬얼라이제이션 LOD에 추가되지 않음

- 시각적으로 표시하지 않으면서 뷰에 있는 데이터를 수정할 수 있음
- LOD 표현식을 사용하면 세부 수준(예: 차원)을 비쥬얼라이제이션에 실제로 드롭하지 않고도 계산에서 사용되는 세부 수준을 결정할 수 있음
예시
LOD FIXED 함수

- <제품 대분류> 수준에서 매출의 합계를 구하고 싶을 때
{ FIXED [제품 대분류]:SUM([매출])}
- 고정하고 싶은 차원 : 집계하고 싶은 측정값
- 결국, <제품 중분류> 차원을 고려하지 않겠다는 말과 같으므로 EXCLUDE를 써도 동일한 결과가 나옴
LOD EXCLUDE 함수
{ EXCLUDE [제품 중분류]:SUM([매출])}
LOD INCLUDE 함수
- 뷰에는 포함되어 있지 않는 차원이지만, 계산식에는 고려해서 집계하고 싶을 때 사용

- 주문 번호별 매출을 볼 때, '지역' 차원도 고려해서 보고 싶다면
{ INCLUDE [지역]:SUM([매출])}
- 집계 수준: 합계

- 집계 수준: 평균

- 열 선반에 \<매출>과 \의 집계 수준을 둘 다 합계로 설정하면 차이가 없지만, 평균으로 설정하면 값이 달라짐
- 집계 수준을 합계로 설정하면 \<매출>의 경우 각 주문 번호에 해당되는 모든 제품 코드의 매출의 합이 계산되고, \의 경우도 각 주문 번호 당 대응되는 지역이 하나이기 때문에 결국 동일한 값이 나옴
- 반면, 집계 수준을 평균으로 설정하면 \<매출>의 경우 각 주문 번호 당 평균 매출(주문 번호 당 총 매출/제품 코드 수)이 계산되지만, \의 경우 각 지역 당 평균 매출이 계산되는데, 주문 번호와 지역은 하나씩 대응되므로 결국 합계로 집계한 것과 동일함
LOD FIXED 함수 응용
Q. 2014년에 처음 구매한 고객이 2017년 매출에 얼마나 기여하고 있을까?

{ FIXED [고객명] : MIN([주문 일자])}
- 화면에는 추가되어 있지 않지만, 고객별로 최초 구매일자를 알고 싶을 때 위와 같이 계산식을 작성할 수 있음
- 해당 그래프를 보면, 2014년에 처음 구매한 고객이 2017년에 73.62% 차지하고 있다는 것을 알 수 있음
예시: 주문 번호 당 평균 매출

- 주문 번호 당 평균 매출을 구하고 싶은데, 위 사진처럼 <주문 번호> 차원이 화면에 포함되어 있을 때 말고 단순히 숫자 하나로만 표현하고 싶다면

{ INCLUDE [주문 번호]:SUM([매출])}
{ FIXED [주문 번호]:SUM([매출])}
- 위와 같이 계산식을 작성하고 집계 수준을 평균으로 바꾸면 672.762가 출력됨
- 이렇게 LOD 계산식을 사용하지 않고 단순히 <매출>의 집계 수준을 평균으로 설정하면, 주문 번호 당 매출의 평균이 아닌 전체 매출의 평균(332.467)이 출력됨
패널별 순위 / 정렬

- 위와 같이 지역별 제품 중분류별 매출의 합계 그래프가 있다고 했을 때, \<합계(매출)> 차원을 ctrl을 누른 채로 마크의 '세부 정보'로 이동
- 세부 정보에 추가하는 이유: 뷰를 변화시키지 않으면서 추가적인 계산 또는 속성을 변경하기 위해서
- 마우스 우클릭 > 불연속형으로 변경
참고
- 초록색 : 연속형 / 파란색 : 불연속형
- 연속형 필드는 축을 생성하는 반면, 불연속형 필드는 머리글을 생성하고 만들어진 측정값을 분할하는 역할
- 마우스 우클릭 > 퀵 테이블 계산 > 순위로 변경

- 해당 필드를 행 선반으로 옮겨 \<지역>과 \<제품 중분류> 사이에 넣음

- 순위가 계산되어 있긴 하지만 지역별로 순위가 아님
- 지역별로 순위를 보고 싶으면 \<합계(매출)> 필드에서 마우스 우클릭 > 다음을 사용하여 계산 > 패널(아래로)

- 만약, '매출의 순위' 열을 보고 싶지 않으면 합계(매출)> 필드에서 마우스 우클릭 > 머리글 표시 해제

효과적인 드릴다운을 위한 집합 동작(Set Action)
- 대시보드 내 세부 정보를 효과적으로 드릴다운할 수 있는 방법 중 하나인 집합 동작 활용 방법 알아보기
- 태블로(Tableau)에서 대시보드의 세부 정보를 효과적으로 드릴다운하는 방법
- 집합 동작(Set Action)을 활용한 드릴다운 기법
- 사용자 친화적인 대시보드를 만들기 위한 팁
집합 동작 활용
- 집합 동작을 활용하여 태블로의 드릴다운 기능을 사용하면 사용자들이 필요한 정보를 쉽게 찾아볼 수 있어 대시보드의 활용도를 크게 높일 수 있음

- '대분류>중분류'별 매출을 나타낸 두 막대 차드 중 오른쪽 차트가 눈에 더 잘 들어옴
- 왼쪽 차트의 경우 대분류와 중분류를 모두 펼친 형태이지만 오른쪽 차트는 선택된 항목의 세부 정보를 나타내는 차트를 활용 → 한눈에 필요 정보를 더욱 명확하게 표현할 수 있음
실습
-
대분류별 매출 막대 그래프 만들기

- [대분류]를 행 선반 위에, [매출]을 열 선반 위에 올려 대분류별 매출을 나타낸 막대 그래프 생성
-
대분류 집합 생성하기


- 왼쪽 데이터 패널 차원의 [대분류] 필드를 마우스 오른쪽 클릭하여 '만들기>집합'을 선택
- 이름을 [대분류 집합]으로 설정하고 '목록에서 선택' 유형으로 선택
-
계산식 만들기

- [대분류 집합]에 IN(포함)되는 경우 [대분류]+'-중분류별' 텍스트가 보이게 하고, OUT(미포함)되는 경우 '+' 버튼이 나타나도록 계산식 만들기
- 예를 들어, [대분류 집합]의 '가구'를 'IN'으로 선택했을 때 '가구 - 중분류별'로 나오게, 선택되지 않은 항목의 경우 '+'로 나오게 설정

- 즉, [대분류 집합]이 'IN'에 해당하는 경우, [중분류] 수준으로 세분화되어 나타나게 하고, 'OUT'인 경우 [대분류]와 수준이 동일하도록 아래와 같은 계산식을 만들어 주는 것

집합을 IF식에서 사용할 때 → IF [집합] THEN ~ END = 집합의 ‘IN’값을 TRUE로 반환
- 드릴다운 설정

- 행 선반의 맨 오른쪽에 만들어 놓은 계산식을 올려 [대분류 집합]에서 IN인 항목만 중분류 수준으로 드릴다운 되도록 설정
- 이 외 'OUT' 항목은 대분류 수준으로 나타나는 것을 확인
- 필요 없는 내용 제외

- 굳이 보시 않아도 되는 내용은 숨김 및 제외 처리
- 행 선반의 맨 위쪽 [대분류] 필드 '머리글 표시' 해제

- 행 선반에 올린 필드 이름을 시트에서 '행에 대한 필드 레이블 숨기기' 선택

-
색상 지정용 계산식 만들기

- 선택한 대분류와 나머지에 대한 구분을 쉽게 하기 위해 대분류 집합 'IN'인 항목과 'OUT' 항목을 구분하는 계산식을 만들어 색상 마크 위에 올리기
-
대시보드
- 음영을 다른 색상으로 변경하여 사용자로 하여금 [대분류] 버튼을 선택하여 상세 정보 확인이 용이하도록 만듦

- 대시보드 상단 탭에서 대시보드 > 동작 > 집합 값 변경을 통해 클릭할 때마다 선택된 대분류 집합이 변경되도록 설정


동작 실행 조건
- 선택 = 마우스 클릭
- 마우스 오버 = 커서를 가져다 대면 동작 실행
- 메뉴 = 마우스 클릭 시 별도의 창 팝업, 창 내에서 클릭
- 대상 집합 = 어떤 집합의 값을 변경할 것인지 지정
회고