56일차

Suhyeon Lee·2024년 12월 18일

CodeKata

SQL

177. Placements

  • 작성한 쿼리
SELECT
  name
FROM
  students s
  JOIN packages p1
  USING(ID)
  JOIN friends f
  USING(ID)
  JOIN packages p2
  ON f.friend_id = p2.id
WHERE
  p2.salary > p1.salary
ORDER BY
  p2.salary
;

참고할 만한 다른 풀이

WITH best_friend_salary as ( SELECT Students.id, name, salary as Person_Salary, Friend_id, (SELECT name FROM Students where id = friend_id) as Friend, (SELECT salary FROM Packages where id = friend_id) as Friend_Salary FROM Students JOIN Friends ON Students.id = friends.id JOIN Packages ON Students.id = Packages.id )
SELECT name FROM best_friend_salary WHERE Person_Salary < Friend_Salary ORDER BY Friend_Salary;
SELECT
  result.name
FROM
  (
  SELECT
    s.ID
    , s.name
    , p.salary AS my_salary
    , f.friend_id
  FROM
    Students s
    JOIN Packages p
    ON s.ID = p.ID
    JOIN Friends f
    ON p.ID = f.ID
  ) result
  JOIN Packages p
  ON result.friend_id = p.id
WHERE
  p.salary > result.my_salary
ORDER BY
  p.salary
;

Python

69. 성격 유형 검사하기

  • 작성한 코드
def solution(survey, choices):
    answer = ''
    result = {'R':0, 'T':0, 'C':0, 'F':0, 'J':0, 'M':0, 'A':0, 'N':0}
    for i in range(len(choices)):
        if choices[i] > 4:
            result[survey[i][1]] += choices[i]-4
        elif choices[i] < 4:
            result[survey[i][0]] += 4-choices[i]
    
    result_keys = list(result.keys())
    result_values = list(result.values())
    
    for i in range(0, 7, 2):
        if result_values[i] >= result_values[i+1]:
            answer += result_keys[i]
        else:
            answer += result_keys[i+1]
    return answer

참고할 만한 다른 풀이

  1. 지표, 선택지 딕셔너리로 만들기
def solution(설문_조사_배열, 선택지_배열):
    지표 = {}
    지표['RT'] = 지표['TR'] = {'R': 0, 'T': 0,}
    지표['FC'] = 지표['CF'] = {'C': 0, 'F': 0,}
    지표['MJ'] = 지표['JM'] = {'J': 0, 'M': 0,}
    지표['AN'] = 지표['NA'] = {'A': 0, 'N': 0,}
    점수 = {
        '매우 비동의': 3,
        '비동의': 2,
        '약간 비동의': 1,
        '모르겠음': 0,
        '약간 동의': 1,
        '동의': 2,
        '매우 동의': 3,
    }
    비동의 = [1, 2, 3]
    동의 = [5, 6, 7]
    선택지 = {
        1: '매우 비동의',
        2: '비동의',
        3: '약간 비동의',
        4: '모르겠음',
        5: '약간 동의',
        6: '동의',
        7: '매우 동의',
    }
    answer = ''

    for 인덱스 in range(len(설문_조사_배열)):
        비동의_캐릭터, 동의_캐릭터 = 설문_조사_배열[인덱스]

        if 선택지_배열[인덱스] in 비동의:
            지표[설문_조사_배열[인덱스]][비동의_캐릭터] += 점수[선택지[선택지_배열[인덱스]]]
            continue

        if 선택지_배열[인덱스] in 동의:
            지표[설문_조사_배열[인덱스]][동의_캐릭터] += 점수[선택지[선택지_배열[인덱스]]]

    결과_배열 = [지표['RT'].items(), 지표['FC'].items(), 지표['MJ'].items(), 지표['AN'].items()]
    정렬된_배열 = []

    for 결과 in 결과_배열:
        정렬된_배열.append(sorted(결과, key=lambda x: -x[1]))

    return ''.join([캐릭터_점수_튜플[0] for [캐릭터_점수_튜플, _] in 정렬된_배열])
  1. zip() 활용
def solution(survey, choices):

    my_dict = {"RT":0,"CF":0,"JM":0,"AN":0}
    for A,B in zip(survey,choices):
        if A not in my_dict.keys():
            A = A[::-1]
            my_dict[A] -= B-4
        else:
            my_dict[A] += B-4

    result = ""
    for name in my_dict.keys():
        if my_dict[name] > 0:
            result += name[1]
        elif my_dict[name] < 0:
            result += name[0]
        else:
            result += sorted(name)[0]

    return result
  • 18번째 줄에서 sorted를 하면 어떤 방식으로 정렬되나요? 3번째 줄에서 key의 순서대로 정렬되나요? 아니면 그냥 abc순인가요?
    • name이 RT, CF, JM, AN 중에 하나이기 때문에 저 넷 중 1개가 정렬되고 그 중 앞에껄 쓴다는 개념인데 기본적으로 다 정렬이 되어 있으므로 현 문제에서는 필요없는 연산이기는 합니다.
  • 두 번째 반복문에서 key, value를 모두 받아오는게 조금 더 효율적이지 않을까 싶습니다.
  1. 리스트 활용
def solution(survey, choices):
    answer = ''
    RTCFJMAN = [0,0,0,0,0,0,0,0]
    str = "RTCFJMAN"
    for i in range(len(survey)):
        RTCFJMAN[str.index(survey[i][1])] += choices[i]-4
    if(RTCFJMAN[0]>=RTCFJMAN[1]): answer+= "R"
    else: answer+="T"
    if(RTCFJMAN[2]>=RTCFJMAN[3]): answer+= "C"
    else: answer+="F"
    if(RTCFJMAN[4]>=RTCFJMAN[5]): answer+= "J"
    else: answer+="M"
    if(RTCFJMAN[6]>=RTCFJMAN[7]): answer+= "A"
    else: answer+="N"
    return answer
  1. enumerate()
def solution(survey, choices):
    scores = {"A":0, "N":0, "C":0, "F":0, "M":0, "J":0, "R":0, "T":0}
    for idx, choice in enumerate(choices):
        if choice - 4 > 0:
            scores[survey[idx][1]] += choice - 4
        elif choice - 4 < 0:
            scores[survey[idx][0]] += 4 - choice

    type = ""
    if scores["R"] >= scores["T"]:
        type += "R"
    else:
        type += "T"

    if scores["C"] >= scores["F"]:
        type += "C"
    else:
        type += "F"

    if scores["J"] >= scores["M"]:
        type += "J"
    else:
        type += "M"

    if scores["A"] >= scores["N"]:
        type += "A"
    else:
        type += "N"

    return type

팀 프로젝트 관련

GeoJSON 파일에서 좌표 정보 읽기

# 행정동 geojson 파일을 읽고, 좌표 정보 읽어오기
with open([행정동 geojson 파일명], encoding='utf-8') as json_file:
    jdata = json_file.read()
    geoJSON = json.loads(jdata)

pts=[]
for  feature in geoJSON['features']:
    if feature['geometry']['type']=='Polygon':
        pts.extend(feature['geometry']['coordinates'][0])    
        pts.append([None, None])
        
    elif feature['geometry']['type']=='MultiPolygon':
        for polyg in feature['geometry']['coordinates']:
            pts.extend(polyg[0])
            pts.append([None, None])
    else: raise ValueError("geometry type irrelevant for map") 

# 자치구 geojson 파일을 읽고, 좌표 정보 읽어오기
with open([자치구 geojson 파일명], encoding='utf-8') as json_file:
    jdata = json_file.read()
    geoJSON = json.loads(jdata)

pts_gu = []
for  feature in geoJSON['features']:
    if feature['geometry']['type']=='Polygon':
        pts_gu.extend(feature['geometry']['coordinates'][0])    
        pts_gu.append([None, None])
        
    elif feature['geometry']['type']=='MultiPolygon':
        for polyg in feature['geometry']['coordinates']:
            pts_gu.extend(polyg[0])
            pts_gu.append([None, None])
    else: raise ValueError("geometry type irrelevant for map") 

# 행정동 좌표정보를 경도(x), 위도(y) 배열로 각각 저장
x = [i for i,j in pts]
y = [j for i,j in pts]
# 자치구 좌표정보를 경도(x_gu), 위도(y_gu) 배열로 각각 저장
x_gu = [i for i,j in pts_gu]
y_gu = [j for i,j in pts_gu]

fig = plt.figure(figsize=(9, 8), facecolor="white")
ax = fig.gca()
ax.plot(x,y, color = 'black') #행정동
ax.plot(x_gu,y_gu, color = 'red') #자치구
plt.show()

격자 정보를 좌표정보(위경도)로 변환

참고

shp → geojson 파일로

공간데이터 파일 변환

지도 데이터 시각화 관련

참고
대한민국 행정구역 공간정보 파일
UTM-K (GRS80)
도로명주소 데이터 좌표계 확인 및 변환
Spatial Join
Geopandas로 polygon 안에 있는 point 개수 세기
격자기반 공간정보 컨텐츠 플랫폼
국토정보플랫폼 국토정보맵
pandas 특정 문자 행 삭제하기

파이썬은 아니지만 참고

통계청 집계구 인구를 격자로 재할당하기

대시보드 참고용

youtube (1)
youtube (2)

회고

  • 어떻게 풀어야 할까 고민했던 부분이 의외로 쉽게 풀렸다!
    • 빈 격자를 찾아서 넣으면 되는구나
profile
2 B R 0 2 B

0개의 댓글