57일차

Suhyeon Lee·2024년 12월 19일

CodeKata

SQL

178. Symmetric Pairs

  • 작성한 쿼리
SELECT
  f1.x
  , f1.y
FROM
  functions f1
  JOIN functions f2
  ON f1.x = f2.y AND f2.x = f1.y
GROUP BY
  f1.x, f1.y
HAVING
  COUNT(f1.x)>1
  OR f1.x < f1.y
ORDER BY
  f1.x
;

→ 나랑 똑같이 푼 유튜브 설명이 있음!
Hackerrank Symmetric Pairs Problem

  • window function과 with절 써서도 풀어보았음
WITH cte AS (
  SELECT
    x
    , y
    , ROW_NUMBER() OVER () AS row_num
  FROM
    functions
)
SELECT
  DISTINCT f1.x, f1.y
FROM
  cte AS f1
  JOIN
  cte AS f2
  ON f1.x = f2.y AND f1.y = f2.x
WHERE
  f1.x <= f1.y 
  AND f1.row_num <> f2.row_num
ORDER BY
  f1.x
;

→ 이것도 유튜브에 똑같이 푼 사람이 있네…
Symmetric pairs HackerRank full solution

참고할 만한 다른 풀이

select distinct f1.x, f1.y
from 
  functions f1 
join 
  functions f2 on f1.x = f2.y and f1.y = f2.x 
where f1.x <= f1.y 
order by f1.x  

→ 내가 작성한 코드에서 group by가 한 역할을 distinct로 대신함

  1. join & union
(
# x! = y
SELECT f1.X, f1.Y
FROM Functions f1
    INNER JOIN Functions f2
        ON f1.X = f2.Y AND f1.Y = f2.X
WHERE f1.X < f1.Y 


UNION

# x = y
SELECT X,Y
FROM Functions
WHERE X=Y
GROUP BY X,Y
HAVING count(*) > 1
)

ORDER BY X
  1. ( sub query + if ) and (groupby + having)
SELECT sub.X, sub.Y
FROM (SELECT if(X <= Y, X , Y) as X, if(X <= Y, Y , X) as Y
      FROM Functions) sub
GROUP BY sub.X, sub.Y
HAVING count(*) >= 2
ORDER BY sub.X

→ 2번, 3번 풀이 해설은 여기에서 읽어보기

SELECT x, y
FROM functions 
WHERE x = y 
GROUP BY x, y
HAVING COUNT(*) = 2 

UNION

SELECT f1.x, f1.y 
FROM functions AS f1
        INNER JOIN functions AS f2 ON f1.x = f2.y AND f1.y = f2.x
WHERE f1.x < f1.y
ORDER BY x

→ 4번 풀이 해설은 여기에서 읽어보기

→ 유튜브 해설도 있다!
해커랭크 Symmetric Pairs

Python

70. 바탕화면 정리

  • 작성한 코드
def solution(wallpaper):
    answer = []
    point_y = []
    point_x = []
    for idx_y, row in enumerate(wallpaper):
        for idx_x, i in enumerate(row):
            if i == '#':
                point_y.append(idx_y)
                point_x.append(idx_x)
    answer = [min(point_y), min(point_x), max(point_y)+1, max(point_x)+1]
    return answer

참고할 만한 다른 풀이

def solution(wallpaper):
    
    x, y = [], []
    
    for i in range(len(wallpaper)):
        for j in range(len(wallpaper[0])):
            if wallpaper[i][j] == '#':
                x.append(i)
                y.append(j)
    
    return [min(x), min(y), max(x) + 1, max(y) + 1]
def solution(wallpaper):
    
    min_y, min_x = len(wallpaper), len(wallpaper[0])
    max_y, max_x = -1, -1
    #최솟값과 최댓값을 구해야하므로 그에 반하는 값 입력
    
    for y_idx, x in enumerate(wallpaper):
    #한줄씩 확인하기
        
        if "#" in x:
        #줄에 "#"이 있을 때 확인하기
            
            if (y_idx < min_y): #맨 위쪽 좌표 구하기(y의 최솟값)
                min_y = y_idx
                
            if (y_idx+1 > max_y): #맨 아래쪽 좌표 구하기(y의 최댓값)
                max_y = y_idx+1
                
            if (x.find("#") < min_x): #맨 왼쪽 좌표 구하기(x의 최솟값)
                min_x = x.find("#")
                
            if (x.rfind("#")+1 > max_x): #맨 오른쪽 좌표 구하기(x의 최댓값)
                max_x = x.rfind("#")+1
        
    return [min_y,min_x,max_y,max_x]

→ 자세한 설명은 여기 읽어보기

def solution(wallpaper):

    width, height = len(wallpaper[0]), len(wallpaper)
    lux, luy, rdx, rdy = height, width, 0, 0

    for row_idx, row in enumerate(wallpaper):
        if "#" in row:
            lux = min(lux, row_idx)
            rdx = max(rdx, row_idx)
            luy = min(luy, row.index("#"))
            rdy = max(rdy, width - row[::-1].index("#") - 1)

    answer = [lux, luy, rdx + 1, rdy + 1]
    return answer

팀 프로젝트

화성시, 하남시 격자 제작

# 필요한 라이브러리 불러오기
import geopandas as gpd
import pandas as pd

# 국토 격자 불러오기
grid_km = gpd.read_file('빈격자(1km).shp', encoding='utf8')

# 하남 법정동 코드가 '4145'로 시작하는 걸 활용
hanam_1km = grid_km[grid_km['SECT_CD'].str.startswith('4145')]

# 좌표계 wgs 84로 바꾸기
hanam_1km = hanam_1km.to_crs(epsg=4326)
  • 제공 받은 격자는 UTM-K 좌표계라서 이를 경위도 좌표계로 바꾸어줘야 분석을 진행할 수 있음!
    • 귀여운 모양의 하남시 획득

초기 시각화 자료 제작

  • EDA
    • 데이터의 구조와 변수 유형(수치, 범주, 날짜 등)을 정확히 파악
    • 데이터의 분포와 기술 통계 요약 및 발표
  • 데이터 클리닝 및 전처리
    • 데이터의 오류, 중복, 불일치 수정
    • 결측치, 이상치 탐지 및 처리
  • 특성 엔지니어링
    • 데이터 분석 목표에 맞는 중요한 특성 선택
    • 필요한 파생 변수 생성
    • 스케일링 등 변환 작업 수행

데이터 관련

GeoPandas 사용 시 알아두면 좋은 점들
GeoPandas Merging data
geopandas.sjoin
Polygon과 Polygon 결합

회고

  • 유튜브에 SQL 푸는 거 해설하는 분들이 많아서 신기하다
    • 같은 방식으로 푼 사람도 있고 다른 방식으로 푼 사람도 있어서 공부가 많이 됨
  • 파이썬 알고리즘 문제 레벨 1인데 왜 이렇게 어렵지
    • 높은 레벨 푸는 분들은 정체가 뭘까
    • 언젠간 나도 문제를 슉슉 풀게 되려나
  • 작업하다 태블로가 터지긴 하지만 그래도 뭔가 성과가 나오고 있어 뿌듯
  • 프로젝트 작업에 바빠서 새롭게 알게 된 내용 정리를 못하고 있어 아쉽다
    • 프로젝트 끝나고 최종 프로젝트 시작하기 전까지 꼭 이제까지 배운 내용들 정리해야 함!
      • 프로젝트 관련
      1. 하면서 배운 거 & 찾은 거
      2. 코드도 다시 읽어보고 모르는 내용 찾아보기
      3. 다른 팀 프로젝트에서 배운 것 정리하기
      • 캠프 관련
      1. 강의 들은 거 복습 & 정리
      2. 라이브세션 복습 & 정리
profile
2 B R 0 2 B

0개의 댓글