70일차

Suhyeon Lee·2025년 1월 9일

CodeKata

SQL

프로그래머스: Python 개발자 찾기

  • 작성한 쿼리
SELECT
  id
  , email
  , first_name
  , last_name
FROM
  developer_infos
WHERE
  skill_1 = 'Python'
  OR skill_2 = 'Python'
  OR skill_3 = 'Python'
ORDER BY
  id
;
  • 다른 방법으로도 풀어보기
SELECT
  id
  , email
  , first_name
  , last_name
FROM
  developer_infos
WHERE
  'Python' IN (skill_1, skill_2, skill_3)
ORDER BY
  id
;

→ 풀면서 조금 궁금한 부분이 생겨서 여기에 정리함

참고할 만한 다른 풀이

  • CONCAT, REGEXP 사용
SELECT
    ID
    , EMAIL
    , FIRST_NAME
    , LAST_NAME
FROM
    DEVELOPER_INFOS
WHERE
    CONCAT_WS(', ', SKILL_1, SKILL_2, SKILL_3) REGEXP 'Python'
ORDER BY
    ID

프로그래머스: 조건에 맞는 개발자 찾기

  • 작성한 쿼리
WITH cte AS (
  SELECT
    SUM(`code`)
  FROM
    skillcodes
  WHERE
    name IN ('Python', 'C#')
)
SELECT
  DISTINCT id
  , email
  , first_name
  , last_name
FROM
  developers
WHERE
  skill_code & (TABLE cte) >= 1
ORDER BY
  id
;

참고할 만한 다른 풀이

SELECT DISTINCT(ID), EMAIL, FIRST_NAME, LAST_NAME FROM DEVELOPERS
WHERE SKILL_CODE& (
(SELECT CODE FROM SKILLCODES WHERE NAME = 'Python') +
(SELECT CODE FROM SKILLCODES WHERE NAME = 'C#')
)!= 0
ORDER BY ID ASC;
SELECT DISTINCT D.ID, D.EMAIL, D.FIRST_NAME, D.LAST_NAME
FROM DEVELOPERS AS D
JOIN SKILLCODES AS S
ON (D.SKILL_CODE & S.CODE) = S.CODE AND  S.NAME IN ('Python', 'C#')
ORDER BY D.ID;

힌트

  • 보려는 값
    • 개발자의 ID, 이메일, 이름, 성
  • 테이블
    • SKILLCODES
      • 개발자들이 사용하는 프로그래밍 언어에 대한 정보를 담은 테이블
    • DEVELOPERS
      • 개발자들의 프로그래밍 스킬 정보를 담은 테이블
  • 조건
    • Python이나 C# 스킬을 가진 개발자
    • !! ON 으로 JOIN을 실행하기 전 조건을 필터링 해주는 것
      • Python이나 C# 스킬을 가진 개발자 를 SKILLCODES 테이블에서 찾아오자!
  • ON 조건(1)
    • 비트연산 &
      • A & B : A 와 B 가 모두 1인 경우에만 1반환

        개발자의 SKILLCODES 가 400인 경우 이진수 변환 시 110010000
        Python 이진수 변환 시 100000000
        110010000 & 100000000
        → 두 자리 모두 1 인 경우만 1 나머지는 0
        결과 : 100000000

  • 나온 결과가 Python 이진수 변환값 100000000 와 같을 경우
    SKILLCODES 테이블의 스킬코드들과 DEVELOPERS 들이 가진 SKILL_CODE 를 비트연산 한 값이 SKILLCODES 테이블의 스킬코드들과 동일한 결과값만 가져오기
    (D.SKILL_CODE & S.CODE) = S.CODE
  • ON 조건(2)
    • SKILLCODES 중 C# (1024) 와 Python (256) 만 가져온다
      정렬
  • ID를 기준으로 오름차순
  1. SKILLCODES 테이블의 CODE 값들을 직접 넣어주면 안되나?
    → 테이블의 값이 변경 될 경우 업데이트가 안되므로 통과하지 못함
  2. on 에는 같은값만 들어가는게 아님!
    on 은 join 전 조건값을 주는것이라고 생각하면 된다
  3. ('Python', 'C#') 을 어디에서 조건을 걸어줘야하지?
    결과적으로 ON,WHERE 둘다 되는데 ON 에 넣을경우 좀더 효율적인 필터링이 가능해서(조건에 해당하는것만 가져오므로 효율적) ON 으로 넣었다
SELECT DISTINCT
D.ID,
D.EMAIL,
D.FIRST_NAME,
D.LAST_NAME
FROM
DEVELOPERS D
LEFT OUTER JOIN SKILLCODES S
ON (D.SKILL_CODE % (S.CODE * 2)) >= S.CODE
WHERE
S.NAME = 'Python'
OR S.NAME = 'C#'
ORDER BY D.ID
SELECT 
    D.ID, 
    D.EMAIL, 
    D.FIRST_NAME, 
    D.LAST_NAME 
FROM 
    DEVELOPERS D
WHERE EXISTS (
    SELECT 1
    FROM SKILLCODES S
    WHERE (D.SKILL_CODE & S.CODE) != 0 
    AND (S.NAME = 'Python' OR S.NAME = 'C#')
)
ORDER BY D.ID;

Python

79. 카펫

  • 작성한 코드
import math
def solution(brown, yellow):
    w = ((brown+4)/2 + math.sqrt(((brown+4)/2)**2-4*(brown+yellow)))/2
    h = ((brown+4)/2 - math.sqrt(((brown+4)/2)**2-4*(brown+yellow)))/2
    return [w,h]

→ 근의 공식 이용해서 풀었음

참고할 만한 다른 풀이

def solution(brown, yellow):
    answer = []
    yellow_x = 0
    yellow_y = 0
    for i in range(1, yellow+1):
        if yellow % i == 0:
            yellow_x = yellow // i
            yellow_y = i
            if 2*yellow_x + 2*yellow_y + 4 == brown:
                answer.append(yellow_x+2)
                answer.append(yellow_y+2)
                break 
            answer.sort(reverse = True)
    return answer
def solution(brown, yellow):
    answer = []
    total = brown + yellow                  # a * b = total
    for b in range(1,total+1):
        if (total / b) % 1 == 0:            # total / b = a
            a = total / b
            if a >= b:                      # a >= b
                if 2*a + 2*b == brown + 4:  # 2*a + 2*b = brown + 4 
                    return [a,b]
            
    return answer
  1. (yellow의 가로2) + (yellow의 세로2) + 4 이 값이 갈색 격자 수와 같으면 됨
    → 노란 격자의 가로(yellow_x)와 세로(yellow_y)를 이용해서 아래와 같은 코드로 해결
def solution(brown, yellow):
    
    answer = []
    
    yellow_x = 0
    yellow_y = 0
    
    for i in range(1, yellow+1) :
        if yellow % i == 0 :
            yellow_x = int(yellow/i)
            yellow_y = i
            if yellow_x*2 + yellow_y*2 + 4 == brown :            
                answer.append(yellow_x+2)
                answer.append(yellow_y+2)
                
                return sorted(answer, reverse = True)
    
    return answer
  • 1부터 노란색의 개수만큼 for문으로 반복하면서 노란색의 수가 i로 나누어 떨어지면 노란색의 가로는 노란색을 i로 나눈 몫이 되고, i는 노란색의 세로가 된다.
    • 이때 위에서 언급한 수식을 사용하여 answer 리스트에 yellow_x+2와 yellow_y+2를 넣어준다.
  • 가로가 세로보다 크거나 같아야 하기 때문에 내림차순으로 정렬을 한 리스트가 반환되도록 했다.

강의

자연어 처리 2회차

특강

코카콜라 생산 공정 최적화 프로젝트

최종 프로젝트

이터널 리턴 관련 github

코드 작성 관련

  • JSON 파일 정리의 핵심은 .keys()인 것 같음
  • Postman에 정리한 호출 결과 보면서 전처리 고민하기
  • .txt 파일 데이터프레임으로 만들기
  • ParserError: '┃' expected after '"'
    • The problem is that pandas treats the char " for queting, and expects " after every " in a cell, which doesn't happen in this csv.
    • To make pandas not treat it as a quoting mark, pass the parameter quoting=3 inside the pd.read_csv function.
  • 코드 짜면서 궁금했던 거 정리

Postman 환경변수 설정

  • Environments > Create Environment
    • VARIABLE에 이름을 입력하고 INITIAL VALUE와 CURRENT VALUE 원하는 내용 입력
      • 예시
    • 사용방식은 {{VARIABLE명}} (중괄호 2번 입력하면 자동완성기능 활용 가능)
  • Authorization 환경변수 설정
    • Postman에서는 요청을 보낼 때 Header에 헤더명과 값을 직접 넣는 방식으로 서버에 헤더를 포함한 요청을 보낼 수 있음
    • 방법 1:
    • 방법 2: 환경설정
      • Authorization값을 직접 넣는 대신 {{authorization}}을 넣으면 설정한 값이 들어감
        참고

회고

  • 원하는 방향으로 코드가 잘 만들어지고 있어서 신기하다! 그만큼 내가 발전했다는 거겠지?
profile
2 B R 0 2 B

0개의 댓글