[TIL] 23.02.15

문종현·2023년 2월 15일
0

TIL

목록 보기
82/119
post-custom-banner

👉 오늘 한 일

  • 프로그래머스 문제풀이(level 1)
  • 프로그래머스 SQL(level 1, 2)

프로그래머스 문제풀이(lv. 1)

1. 정수 제곱근 판별

  • 정답률 86%
  • 제곱근을 씌우면 float 형태가 되버림. 따라서, 제곱근을 씌운 뒤 올림해서 다시 제곱근을 씌운 값과 같은지 비교
import math
def solution(n):
    return math.pow((n**0.5)+1,2) if math.ceil(n**0.5) == n**0.5 else -1
  • 다른 사람 풀이
    • 제곱근을 씌운 수를 1로 나누어서 정수인지 판단함..! math 모듈을 불러오지 않아도 이렇게 해결할 수 있었다!
def nextSqure(n):
    sqrt = n ** (1/2)

    if sqrt % 1 == 0:
        return (sqrt + 1) ** 2
    return -1

2. x만큼 간격이 있는 n개의 숫자

  • 정답률 86%, 2 try
  • x가 양수, 0, 음수일 때를 나누어서 생각
def solution(x, n):
    if x > 0:
        return [i for i in range(x, x*n+1, x)]
    elif x == 0:
        return [0]*n
    else:
        return [i for i in range(x, x*n-1, x)]
  • 다른 사람 풀이
    • 등차수열 일반항의 특징을 활용함
def number_generator(x, n):
    return [i * x + x for i in range(n)]

3. 정수 내림차순으로 배치하기

  • 정답률 86%
  • 문자열로 만들어 리스트에 담은 후 내림차순 정렬해서 합쳐줌
def solution(n):
    lst = [i for i in str(n)]
    return int(''.join(sorted(lst, reverse=True)))
  • 다른 사람 풀이
    • 병합정렬을 직접 구현함
def merge(left, right):
    result = []
    while len(left) > 0 or len(right) > 0:
        if len(left) > 0 and len(right) > 0:
            if left[0] >= right[0]:
                result.append(left[0])
                left = left[1:]
            else:
                result.append(right[0])
                right = right[1:]
        elif len(left) > 0:
            result.append(left[0])
            left = left[1:]
        elif len(right) > 0:
            result.append(right[0])
            right = right[1:]
    return result

def mergeSort(arr):
    if len(arr) <= 1:
        return arr

    mid = len(arr) // 2
    left = arr[:mid]
    right = arr[mid:]

    left = mergeSort(left)
    right = mergeSort(right)

    return merge(left, right)

def solution(n):
    arr = list(str(n))
    n = int(''.join(mergeSort(arr)))
    return n

4. 문자열을 정수로 바꾸기

  • 정답률 86%
  • - 기호가 붙었을 때와 나머지(+ 기호가 붙었을 때, 아무것도 붙지 않았을 때)를 나누어서 고려
def solution(s):
    if s[0] == "-":
        return int(s.replace("-", "")) * -1
    
    else:
        return int(s.replace("+", ""))
  • 다른 사람 풀이
    • 정수형으로 바꿀 때 문자 +, -는 알아서 양,음의 기호로 인식하는 것 같다..!
def strToInt(str):
    a = int(str)
    return a

5. 하샤드 수

  • 정답률 86%
  • 자리수 합을 변수로 선언한 후에 나누어 떨어지는지 체크함
def solution(x):
    x_sum = sum([int(n) for n in str(x)])
    return True if x % x_sum == 0 else False
  • 다른 사람 풀이
    • 같은 풀이를 한줄로 정리
def Harshad(n):
    return n % sum([int(c) for c in str(n)]) == 0

6. 콜라츠 추측

  • 정답률 84%
  • num이 1이 아니면 반복, 한 번 반복할 때마다 cnt값을 1씩 늘려주며 500회에 도달하면 반복 중지
def solution(num):
    cnt = 0
   
    while num != 1:
        if num % 2 == 0:
            num /= 2
        elif num % 2 != 0:
            num = num * 3 + 1
        cnt += 1
        
        if cnt == 500:
            cnt = -1
            break

    return cnt

7. 서울에서 김서방 찾기

  • 정답률 84%
  • list.index()로 인덱스 넘버를 변수로 선언한 후에 f-string으로 return
def solution(seoul):
    idx = seoul.index("Kim")
    return f"김서방은 {idx}에 있다"
  • 다른 사람 풀이
    • .format을 활용
def findKim(seoul):
    return "김서방은 {}에 있다".format(seoul.index('Kim'))

8. 나누어 떨어지는 숫자 배열

  • 정답률 84%
  • 빈 리스트 선언, arr를 돌면서 divisor로 나누어 떨어지면 result에 추가, 다 돌고난 후 result가 비었으면 -1을 추가
def solution(arr, divisor):
    result = []
    for n in sorted(arr):
        if n % divisor == 0:
            result.append(n)
    if len(result) == 0:
        result.append(-1)
    return result
  • 다른 사람 풀이
    • or을 사용해 or 앞이 참일경우 해당 값까지만, 거짓일경우 뒤에 것이 호출되도록 함(빈 리스트는 False로 취급)
def solution(arr, divisor): 
	return sorted([n for n in arr if n%divisor == 0]) or [-1]

9. 핸드폰 번호 가리기

  • 정답률 84%
  • 마지막 4자리를 제외한 수들을 그들의 길이만큼 *로 바꿔줌
def solution(phone_number):
    return phone_number.replace(phone_number[:-4], len(phone_number[:-4])*"*")
  • 다른 사람 풀이
    • replace를 사용하지 않고 더 간결하게 풀었다!
def hide_numbers(s):
    return "*"*(len(s)-4) + s[-4:]

SQL

1. 12세 이하인 여자 환자 목록 출력하기 💡

  • TLNO 컬럼에서 NULL 값은 NONE으로 출력하기
  • IF문 사용 체크
SELECT PT_NAME, PT_NO, GEND_CD, AGE, IF(TLNO IS NULL, 'NONE', TLNO) TLNO
FROM PATIENT
WHERE AGE <= 12 AND GEND_CD = "W"
ORDER BY AGE DESC, PT_NAME

2. 흉부외과 또는 일반외과 의사 목록 출력하기

  • OR을 사용하면 MCDP_CD 컬럼을 두 번 호출해야 하지만 IN을 사용하면 간단하게 불러올 수 있음
SELECT DR_NAME, DR_ID, MCDP_CD, LEFT(HIRE_YMD, 10) HIRE_YMD
FROM DOCTOR
WHERE MCDP_CD IN('CS', 'GS')
ORDER BY HIRE_YMD DESC, DR_NAME

3. 인기있는 아이스크림

SELECT FLAVOR
FROM FIRST_HALF
ORDER BY TOTAL_ORDER DESC, SHIPMENT_ID

4. 3월에 태어난 여성 회원 목록 출력하기

  • level 2
  • TLNO가 NULL인 것을 출력하지 않기 위해 WHERE절에 IS NOT NULL 조건 추가
SELECT MEMBER_ID, MEMBER_NAME, GENDER, LEFT(DATE_OF_BIRTH, 10) DATE_OF_BIRTH
FROM MEMBER_PROFILE
WHERE MONTH(DATE_OF_BIRTH) = '3' AND GENDER = 'W' AND TLNO IS NOT NULL
ORDER BY MEMBER_ID

5. 재구매가 일어난 상품과 회원 리스트 구하기 📌

  • level 2
  • 같은 유저 아이디에서 같은 상품을 재구매한 경우이므로 USER_ID, PRODUCT_ID 두 컬럼 모두를 사용해서 GROUP BY 해야함
SELECT USER_ID, PRODUCT_ID
FROM ONLINE_SALE
GROUP BY USER_ID, PRODUCT_ID
HAVING COUNT(USER_ID) >= 2
ORDER BY USER_ID, PRODUCT_ID DESC
profile
자라나라 새싹새싹🌱
post-custom-banner

0개의 댓글