본문 바로가기

TIL

[240119] SQL: 코드카타 108~109 & 파이썬: 코드카타 19~20

[SQL 코드카타]

1. lead 혹은 row_number 함수 활용  

180. Consecutive Numbers

https://leetcode.com/problems/consecutive-numbers

 

1) 어떤 문제가 있었나

동일한 열의 3번 이상 연속되는 숫자 구하기

 

2) 내가 시도해본 건 무엇인가

맨 첫 행 값이 바로 다음과 다다음 행의 칼럼과 값이 같아야 한다고 생각하고 lead 함수 적용

 

3) 어떻게 해결했나

① lead 함수를 2번 써서 2개의 열을 신규 생성 

② lead 함수 사용 쿼리는 from절 서브쿼리로 넣고, where 절에 3개의 속성값이 동일해야 한다는 조건 적용 

select num ConsecutiveNums 
from (
    select num, 
        lead(num) over(order by id) num1,
        lead(num, 2) over(order by id) num2
    from Logs) a
where num = num1 = num2;

 

4) 무엇을 새롭게 알았나

다른 사람 풀이에서 row_number 함수를 적용한 사례를 확인

select num ConsecutiveNums
from 
(select id, num, 
	#id가 순차적으로 자동 생성되는 부분을 활용
	#num으로 그룹핑한 뒤 row_number를 생성해 id에서 row_number 값을 빼기 
        id - row_number()over(partition by num order by num)  as rw 
    from Logs ) a 
group by num , rw   #num 값이 1개만 나오지 않도록 rw도 함께 적용해야 함 
 having count(rw) >=3

 

① row_number 사용하여  num의 그룹 및 정렬에 따라 순서 부여 > id 값에서 뺀 rw 열 생성 

 

② ①을 서브쿼리로 넣고, rw(id = row_number)의 개수가 3개 이상인 값을 having 절로 넣어서 정답 값 추출 


[파이썬 코드카타]

1. 제곱근 구하기 

정수 제곱근 판별

https://school.programmers.co.kr/learn/courses/30/lessons/12934

 

1) 어떤 문제가 있었나

제곱은 ** 로 구하는 것은 어렴풋이 알고 있었으나, 어떤 정수의 제곱근인지, 즉 루트(√)값을 구하는 방법을 모름

 

2) 내가 시도해본 건 무엇인가

약간의 구글링을 하며 2**2, 4**1/2, 4**0.5 등 여러 조합을 쳐보며, 제곱근을 구하는 법과 정수 조건을 거는 법을 찾아봄 

 

3) 어떻게 해결했나

def solution(n):
    x = n**0.5
    if x >= 1 and x == int(x): 
        return (x+1)**2
    else:  
        return -1

 

4) 무엇을 새롭게 알았나

- 121**1/2 로 넣으면 값이 자꾸 60.5로 나왔는데, 괄호를 넣거나(121**(1/2)) 실수로 넣어서(121**0.5) 해결 > 괄호가 중요함 

 

 

2. join 함수 

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

https://school.programmers.co.kr/learn/courses/30/lessons/12933

 

1) 어떤 문제가 있었나

정수를 문자열로 바꾼 뒤 리스트에 하나씩 넣어서 정렬은 끝냈는데, 리스트에 숫자를 빼내는 방법을 모름  

 

2) 내가 시도해본 건 무엇인가

구글링 및 다른 사람 풀이를 통해 join 함수가 있다는 것을 알게 되어 적용해봄 

 

3) 어떻게 해결했나

def solution(n):
    answer = []
    n = str(n)
    for i in n:
        answer.append(i)
        answer.sort(reverse=True)
    answer = ''.join(answer)  #홑따옴표 2개
    return int(answer)
    
#다른 사람 풀이
def solution(n):
    n = str(n)
    n = sorted(n, reverse=True)   #리스트를 만들어 for문으로 넣지 않아도 sorted로 문자열 정렬 가능
    n = ''.join(n)
    return int(n)

 

4) 무엇을 새롭게 알았나

- sort 와 sorted 정렬 함수의 활용을 더 공부하게 됨

 └  sort : list.sort(reverse=True) 사용 시 리스트 안의 변수가 정렬됨. 리스트 > 리스트  

 └  sorted: a = sorted(n, reverse=True) 사용 시 각 문자열이 리스트 안의 개별 변수로 들어가면서 정렬 됨. 문자열 > 리스트 

 

- join: 리스트에 있는 요소 하나하나를 합쳐서 하나의 문자열로 반환하는 함수

 └ ''.join(리스트): ['a', 'b', 'c']  리스트를 'abc'의 문자열로 합쳐서 반환 * 홑따옴표 2개로 표기 
 └ '구분자'.join(리스트): 리스트의 값과 값 사이에 '구분자'를 넣어서 하나의 문자열로  합쳐서 반환.  '_'.join(['a', 'b', 'c'])는 "a_b_c"