SQL 공부합시다(2)

yeahzxnn·2일 전

CodingTest

목록 보기
13/13
post-thumbnail

어제 사이트 정착에 시행착오를 겪고(?)
HackerRank랑 Leetcode로 다시 돌아왔습니다.

예전에 DailyLeetCode 레포 만들어두고 extensio으로 자동 커밋 시켰었는데, 버전이 만료가 되었는 지 extension이 작동을 안 해서 다시 업데이트 해줬습니당

HackerRank는 extension이 다른 걸로 누가 배포(?) 해둔 게 있길래 그것도 같이 해뒀습니다..근데 비추 누락 심함.

제 깃허브 링크 두고 갑니다.

해외 사이트용
HacerRank 코드 깃허브
LeetCode 코드 깃허브

국내 사이트용
프로그래머스,백준,SWEA 코드 깃허브


SQL

오늘은 HackerRank SQL 3문제 정도(Middle)로 하겠습니다.

1.Occupations(Middle)

문제 핵심:
데이터를 재구조화(Pivoting)
각 직업군 내에서 이름의 순서를 매기는 것

1단계: 이름마다 "순번표" 뽑아주기 (안쪽 쿼리)

  • ROW_NUMBER(): 1, 2, 3...번호 매기기
  • PARTITION BY Occupation: "직업별로 따로" 번호를 매기기
  • ORDER BY Name: 이름 순서대로 번호 주기

2단계: "자기 자리" 찾아주기 (CASE WHEN)
직업이 맞으면 두고, 아니면 빈칸

3단계: 빈칸 치우고 "한 줄로 합치기" (GROUP BY & MAX)
MAX Null 무시하고 글자가 있는 이름 선택하기

SELECT 
    MAX(CASE WHEN Occupation = 'Doctor' THEN Name END),
    MAX(CASE WHEN Occupation = 'Professor' THEN Name END),
    MAX(CASE WHEN Occupation = 'Singer' THEN Name END),
    MAX(CASE WHEN Occupation = 'Actor' THEN Name END)
FROM (
    SELECT Name, Occupation, 
           ROW_NUMBER() OVER (PARTITION BY Occupation ORDER BY Name) as rn
    FROM Occupations
) AS temp
GROUP BY rn;

2.Challenges(Middle)

문제 핵심:

조건 A: 챌린지 개수가 전체 최대치(MAX)인 사람은 동점자가 몇 명이든 무조건 출력
조건 B: 최대치가 아닌데 동점자(같은 개수)가 있다면, 그 사람들은 결과에서 제외

SELECT h.hacker_id, h.name, COUNT(c.challenge_id) AS challenges_created
FROM Hackers h
JOIN Challenges c ON h.hacker_id = c.hacker_id
GROUP BY h.hacker_id, h.name

HAVING 
    challenges_created = (
        SELECT MAX(cnt)
        FROM (
            SELECT COUNT(challenge_id) AS cnt 
            FROM Challenges 
            GROUP BY hacker_id
        ) sub1
    )
    OR
    challenges_created IN (
        SELECT cnt
        FROM (
            SELECT COUNT(challenge_id) AS cnt 
            FROM Challenges 
            GROUP BY hacker_id
        ) sub2
        GROUP BY cnt
        HAVING COUNT(cnt) = 1
    )

ORDER BY challenges_created DESC, h.hacker_id;

3.Weather Observation Station 18(Middle)

핵심

  1. 필요한 4개의 좌표값 찾기 문제에서 요구하는 a,b,c,da, b, c, d

    aa: 위도(LAT_N)의 최솟값 \rightarrow MIN(LAT_N)
    bb: 경도(LONG_W)의 최솟값 \rightarrow MIN(LONG_W)
    cc: 위도(LAT_N)의 최솟값 \rightarrow MAX(LAT_N)
    dd: 경도(LONG_W)의 최솟값 \rightarrow MAX(LONG_W)

  2. 맨해튼 거리 공식 적용하기 두 점 (a,b)(a, b)(c,d)(c, d) 사이의 맨해튼 거리는

    ac+bd|a - c| + |b - d|

SELECT (
    ROUND(
        ABS(MIN(LAT_N) - MAX(LAT_N)) + ABS(MIN(LONG_W) - MAX(LONG_W)), 4
    )
)
FROM Station

HackerRank Extension 내가 제작할까보다,,,

profile
Challenging & Growing

0개의 댓글