내일배움캠프_데이터분석_2기/TIL

[TIL] camp_day16_240507

단ee 2024. 5. 7. 23:04

캠프 4주차. 하루 더 쉬고 와서 그런가 오늘은 목표한 공부량을 많이 못 채웠다.
내일 모레부터 전처리 및 시각화 세션 시작이라 그 때까지는 파이썬과 ADsP 공부를 할 예정

학습 내용


  1. 조건 없이 테이블 조인하기(SQL)

    • leetcode_컨테스트 참여율 계산하기

    • JOIN 할 테이블을 쓰고, ON 절 조인 조건을 1=1 로 설정하면, 두 테이블이 그냥 붙는다.

    • 문제 풀이 과정

        SQL
        SELECT r.contest_id
        ,round(count(distinct r.user_id)/ttl_cnt*100,2) as percentage
        FROM Register as r 
        LEFT JOIN 
        (
         SELECT count(distinct user_id) as ttl_cnt
         FROM Users
         ) as u
        on 1=1
        GROUP BY r.contest_id
        ORDER BY percentage desc, r.contest_id asc
  2. 확률 계산하기(SQL)

    • avg(if(조건, 1, 0)) 를 계산하면 전체에 대해 특정 조건을 만족하는 값의 비율을 계산할 수 있다.

        # 예를 들어, 전체 5명 중에서 여자가 2명 뿐이라면, (= if(여자, (참일 때=)1, (거짓일 때=)0)) 
        # (여자, 여자, 남자, 남자, 남자) → if문으로 출력한 결과는 (1, 1, 0, 0, 0) 이 되고
        # 이들의 평균을 계산하면 2/5 = 0.4 가 된다.
        # 즉, sum(if(특정 조건이 참일 때 1을 출력하도록 함)) / count(전체) 로 구할 수 있는, 
        # 특정 조건 값이 전체에 대해 차지하는 비율 계산을 평균을 구하는 것으로 대신할 수 있다!
        SQL
        # 첫 번째로 작성한 쿼리
         -- quality : avg(rating / position)
         -- poor_query_percentage : (less than 3 rating) / ttl_cnt
        SELECT query_name
        ,round(avg(rating / position),2) as quality
        ,round(sum(if(rating < 3, 1, 0))/count(query_name)*100,2) as poor_query_percentage
            # 이 부분을 처음에는 집계함수를 두 번 써서 풀었는데,
            # 아래 주석처리한 쿼리로 풀이해도 같은 값을 얻을 수 있다. 
            # ,round(avg(if(rating < 3, 1, 0))*100,2) as poor_query_percentage
        FROM Queries as a
         WHERE query_name is not NULL
         Group by query_name ;
  3. 제곱근으로 풀이한 코테(Python)

    1. 프로그래머스_약수의 개수와 덧셈
      • 두 정수가 주어지고, 두 숫자들 사이의 모든 정수의 합을 구하는데, 그 중 약수의 개수가 홀수인 숫자만 빼주기.
      • 약수의 개수가 홀수가 되는 경우는 n^2인 수, 즉 제곱근이 정수일 경우, 다시 말해 제곱근으로 나눴을 때 나머지가 0인 수
    2. 프로그래머스_정수제곱근 판별
      • 주어진 정수 n이 어떤 수를 제곱한 숫자인지 판별
      • n을 x로 나눴을 때의 값이 x와 일치할 경우 or n의 제곱근이 정수일 경우
    • 2번 문제는 계속 안 풀렸던 건데 드디어 해결했다.

      • if 문 다음에 else 문을 써서 반복문이 제대로 돌아가지 않았던 문제가 있었다. 코드블럭 범위 수정하여 해결했다.
    • 둘 다 math 라이브러리 import 해서 풀이했다. 안 쓰고 푼 코드도 첨부

        Python
        # 1번 문제
        import math
          def solution(left, right):
              answer = 0
              for i in range(left, right + 1):
                  if i % math.sqrt(i) == 0:
                      answer += -i
                  else:
                      answer += i
              return answer
         Python
         # 2번 문제 - math 라이브러리 사용
         import math
          def solution(n):
              for x in range(1, n+1):
                  if x == math.sqrt(n):
                      return (x + 1)**2
              return -1
         Python
         # 2번 문제 - 연산자로만 계산
         def solution(n):
          for x in range(1, n+1):
              if n / x == x:
                  return (x + 1) ** 2
          return -1

고찰 & 기타


  • 잘 풀리지 않았던 코드나 쿼리를 리뷰하면서 다시 풀 때 해결되면 그만큼 기분 좋은 일이 없다.
  • 특히 알고리즘 문제를 풀 때 예전에 배웠던 수학 개념으로 풀면 그렇게 기분이 좋을 수가 없다. 수2 응시한 이과생이었던 보람이 있다.
  • 함수나 개념에 익숙해지면 알고리즘 코딩테스트 같은 경우는 여러 문제가 한 번에 풀린다.
    배운 내용을 완전히 내 것으로 만드는 과정이 얼마나 중요한 지 새삼 느꼈다.

'내일배움캠프_데이터분석_2기 > TIL' 카테고리의 다른 글

[TIL] camp_day18_240509  (0) 2024.05.09
[TIL] camp_day17_240508  (0) 2024.05.08
[TIL] camp_day15_240503  (0) 2024.05.03
[TIL] camp_day14_240502  (0) 2024.05.02
[TIL] camp_day13_240501  (1) 2024.05.01