
어제 사이트 정착에 시행착오를 겪고(?)
HackerRank랑 Leetcode로 다시 돌아왔습니다.
예전에 DailyLeetCode 레포 만들어두고 extensio으로 자동 커밋 시켰었는데, 버전이 만료가 되었는 지 extension이 작동을 안 해서 다시 업데이트 해줬습니당
HackerRank는 extension이 다른 걸로 누가 배포(?) 해둔 게 있길래 그것도 같이 해뒀습니다..근데 비추 누락 심함.
제 깃허브 링크 두고 갑니다.
해외 사이트용
HacerRank 코드 깃허브
LeetCode 코드 깃허브
국내 사이트용
프로그래머스,백준,SWEA 코드 깃허브
오늘은 HackerRank SQL 3문제 정도(Middle)로 하겠습니다.
문제 핵심:
데이터를 재구조화(Pivoting)
각 직업군 내에서 이름의 순서를 매기는 것
1단계: 이름마다 "순번표" 뽑아주기 (안쪽 쿼리)
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;
문제 핵심:
조건 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;
핵심
필요한 4개의 좌표값 찾기 문제에서 요구하는
: 위도(LAT_N)의 최솟값 MIN(LAT_N)
: 경도(LONG_W)의 최솟값 MIN(LONG_W)
: 위도(LAT_N)의 최솟값 MAX(LAT_N)
: 경도(LONG_W)의 최솟값 MAX(LONG_W)
맨해튼 거리 공식 적용하기 두 점 와 사이의 맨해튼 거리는
SELECT (
ROUND(
ABS(MIN(LAT_N) - MAX(LAT_N)) + ABS(MIN(LONG_W) - MAX(LONG_W)), 4
)
)
FROM Station
HackerRank Extension 내가 제작할까보다,,,