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
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로 대신함
(
# 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
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
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)

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