[TIL] 23.02.02

문종현·2023년 2월 2일
0

TIL

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

👉 오늘 한 일

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

프로그래머스 문제풀이

1. 팩토리얼

  • 정답률 83%
  • while문을 사용해 구현. n이 !i 보다 크거나 같아야 하므로 result에서 1을 빼줌
def solution(n):
    i = 1
    result = 0
    while n >= i:
        i *= result+1
        result += 1
    return result - 1
  • 다른 사람 풀이
    • math 모듈 활용. 제한사항에 n 값이 제한되어 있었으므로 n의 최대값보다 작은 팩토리얼 중 가장 큰 팩토리얼인 k = 10에서 줄여나감
from math import factorial

def solution(n):
    k = 10
    while n < factorial(k):
        k -= 1
    return k

2. 2차원으로 만들기

  • 정답률 82%
  • numpy.reshape 로 차원 변경 후 다시 리스트 형태로 담아주려고 시도했으나 typeerror 발생. reshape 하면서 리스트 내 요소들 타입이 numpy.int64 형태로 변경돼서 그런 것 같음
import numpy as np
def solution(num_list, n):
    dim = np.reshape(num_list,(len(num_list)//n, n))
    result = []
    for d in dim:
        result.append(list(d))
    return result
  • 다시 시도
    • num_list를 n만큼 슬라이싱 해서 새로운 리스트로 묶은 후에 다시 새로운 리스트에 추가하는 방식으로 풀이함
def solution(num_list, n):
    lst = []
    result = []
    while num_list != []:
        for i in num_list[0:n]:
            lst.append(i)
            num_list.pop(0)
        result.append(lst)
        lst = []
    return result
  • 다른 사람 풀이
    • 그냥 슬라이싱 해서 새로운 리스트에 추가하면 되는 것이었다..!
def solution(num_list, n):
    answer = []
    for i in range(0, len(num_list), n):
        answer.append(num_list[i:i+n])
    return answer

3. 가까운 수

  • 정답률 82%, try 2
  • 처음에 sort를 해주지 않고 답안을 작성했더니 테스트 케이스 하나가 틀림. 거리가 같은 수가 여러개면 더 작은 수를 return해야 하므로 sort로 정렬해줌
def solution(array, n):
    diff = []
    array = sorted(array)
    for i in array:
        diff.append(abs(i - n))
    return array[diff.index(min(diff))]
  • 다른 사람 풀이
    • 정렬 조건을 두개로 줘서 정렬조건 1. 두 수의 거리, 2. 수가 작은 순으로 return
def solution(array, n):
    array.sort(key = lambda x : (abs(x-n), x-n))
    answer = array[0]
    return answer

4. k의 개수

  • 정답률 82%
  • 처음에는 판다스(시리즈)의 str accessor를 사용하려고 했으나 넘파이와 마찬가지로 typeerror 발생. 판다스와 넘파이는 사용을 지양해야겠다.. 그래서 범위 내의 모든 수를 문자열 리스트로 생성한 후에 join으로 연결시켜 count 하는 방법으로 풀이함
def solution(i, j, k):
    lst = [str(i) for i in range(i, j+1)]
    return ''.join(lst).count(str(k))
  • 다른 사람 풀이
    • 반복문을 돌면서 count한 뒤 sum
def solution(i, j, k):
    answer = sum([str(i).count(str(k)) for i in range(i,j+1)])
    return answer

5. 한 번만 등장한 문자

  • 정답률 80%
  • 모든 알파벳을 돌면서 s에 포함된 횟수가 한번이면 리스트에 담고, join해서 출력. 알파벳 순으로 돌기 때문에 정렬은 하지 않아도 됨
def solution(s):
    alphabet = "abcdefghijklmnopqrstuvwxyz"
    result = []
    for a in alphabet:
        if s.count(a) == 1:
            result.append(a)
    return ''.join(result)
  • 다른 사람 풀이
    • s에 있는 알파벳으로만 순회함
def solution(s):
    answer = "".join(sorted([ch for ch in s if s.count(ch) == 1]))
    return answer

SQL

1. 역순 정렬하기

SELECT NAME, DATETIME
FROM ANIMAL_INS
ORDER BY ANIMAL_ID DESC;

2. 아픈 동물 찾기

SELECT ANIMAL_ID, NAME
FROM ANIMAL_INS
WHERE INTAKE_CONDITION = "Sick"
ORDER BY ANIMAL_ID

3. 어린 동물 찾기

SELECT ANIMAL_ID, NAME
FROM ANIMAL_INS
WHERE INTAKE_CONDITION != "Aged"
ORDER BY ANIMAL_ID

4. 동물의 아이디와 이름

SELECT ANIMAL_ID, NAME
FROM ANIMAL_INS
ORDER BY ANIMAL_ID

5. 조건에 맞는 회원수 구하기

SELECT COUNT(*)
FROM USER_INFO
WHERE YEAR(JOINED) = "2021" AND AGE BETWEEN 20 AND 29
profile
자라나라 새싹새싹🌱
post-custom-banner

0개의 댓글