TIL

2024-04-04

여연찌 2024. 4. 4. 18:49
  • 오늘 진행한 일

1. SQL 코드카타(61~65)

2. 알고리즘 코드카타(24~25)

 


  • 기억할 내용

 

SQL

 

특정 위치 음식점의 평균 점수를 구하는 문제에서

 

음식점 이름과 음식타입에 랜덤한 값이 들어가는 것인가 해서 서브쿼리에~ 그룹바이 추가에

온 갖 쿼리를 짰는데 그냥 음식점별로 평균만 내주면 되는 문제였다..

아직 GROUP BY 에 대한 개념이 제대로 잡히지 않았는지 다시 살펴봐야겠다

 

 

자동차 평균 대여 기간 구하기

https://lyj-01.tistory.com/73

 

자동차 평균 대여 기간 구하기

CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블에서 평균 대여 기간이 7일 이상인 자동차들의 자동차 ID와 평균 대여 기간(컬럼명: AVERAGE_DURATION) 리스트를 출력하는 SQL문을 작성해주세요. 평균 대여 기간은 소

lyj-01.tistory.com

 

평균 대여 기간을 구하면서 

SELECT car_id
     , ROUND(AVG(DATEDIFF(end_date,start_date)+1),1) AVERAGE_DURATION
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE avg((DATEDIFF(end_date,start_date)+1))>=7
GROUP BY 1
ORDER BY 2 DESC, 1 DESC

이렇게 했더니 오류가 떴다!

WHERE 절에서는 집계함수 avg 를 사용할 수 없다

SELECT car_id
     , ROUND(AVG(DATEDIFF(end_date,start_date)+1),1) AVERAGE_DURATION
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
GROUP BY 1
HAVING AVERAGE_DURATION>=7
ORDER BY 2 DESC, 1 DESC

 

HAVING 에서 사용해주어야 한다! 꼭 기억할 것

 

 

헤비 유저가 소유한 장소

https://lyj-01.tistory.com/74

 

헤비 유저가 소유한 장소 # where 절 서브쿼리

이 서비스에서는 공간을 둘 이상 등록한 사람을 "헤비 유저"라고 부릅니다. 헤비 유저가 등록한 공간의 정보를 아이디 순으로 조회하는 SQL문을 작성해주세요. SELECT id,name,host_id FROM places WHERE host_

lyj-01.tistory.com

 

having 을 사용하여 뽑는 것 까지는 진행했으나

서브쿼리가 익숙하지 않아 어느곳에 넣어야 하는지 여러번 헤맸다

 

이 문제 같은 경우에는 먼저 나온 결과를 기반으로 메인쿼리에서 출력해주기 때문에

where 절에서 서브쿼리를 사용했다!

 

서브쿼리를 어떤 구문에서 사용할지 공부해보아야겠다.

 

 

 

 

 


파이썬

 

 

 

풀리지 않아서 괴로웠던 궁금증이 드디어 해결 되었다!

빈 리스트를 생성할 때 [] 와 list() 가 어떤 차이가 있는지 

매니저님 답변과 구글링을 통해 정리한 내용을 첨부하겠다

 

https://lyj-01.tistory.com/70

 

빈 리스트 생성 [] 와 list() 의 차이

Q. 정수 n을 리스트로 생성하여 sort 할때 왜 list() 를 사용해야하는지? 부터 시작한 궁금증으로 정리해보았다! 대괄호를 이용한 방법 list1 = [] 이 경우에는 (,) 콤마 로 값을 나누어 주어야 각각의

lyj-01.tistory.com

 

 

 

서울에서 김서방 찾기

https://lyj-01.tistory.com/72

 

서울에서 김서방 찾기 # index()

String형 배열 seoul의 element중 "Kim"의 위치 x를 찾아, "김서방은 x에 있다"는 String을 반환하는 함수, solution을 완성하세요. seoul에 "Kim"은 오직 한 번만 나타나며 잘못된 값이 입력되는 경우는 없습니

lyj-01.tistory.com

인덱스 찾는 함수를 구글링해서 찾아본 후에 코드를 짜보았다

def solution(seoul):
    a = seoul.index("Kim")
    b = "김서방은"
    c = "에 있다"
    return str(b)+' '+str(a)+str(c)

원하는 결괏값이 나오기 위해 수정에 수정을 했을 때 통과 되었는데

다른 풀이를 찾아보니 한줄로도 충분히 줄일 수 있더라!

return "김서방은 "+str(seoul.index("Kim"))+"에 있다"

문자열을 합쳐주는 + 는 문자열 만 가능하기 때문에 인덱스를 찾아 str로 변경을 해주어야 한다

첫번째 짰던 코드에서도 b 와 c는 str 을 안해주어도 됐음..

 

format 함수로도 사용해 볼 수 있었는데 다음기회에는 한번 적용해서 코드를 짜보고 싶다

 

 

 

나누어 떨어지는 숫자 배열

https://lyj-01.tistory.com/71

 

나누어 떨어지는 숫자 배열

array의 각 element 중 divisor로 나누어 떨어지는 값을 오름차순으로 정렬한 배열을 반환하는 함수, solution을 작성해주세요. divisor로 나누어 떨어지는 element가 하나도 없다면 배열에 -1을 담아 반환하

lyj-01.tistory.com

def solution(arr, divisor):
    answer = []        # 빈 리스트 생성
    for array in arr:    # 자연수 배열인 arr을 하나씩 넣어 반복
        if array % divisor==0:    # divisor 로 나누어 떨어지면
            return answer.append(array)    # answer에 그 값을 추가 해서 반환해라
        else:                   # 그 외의 경우에는
            return answer.append(-1)     # answer에 -1 을 추가해 해서 반환해라

 

결괏값은 null 이 나왔다

 

* 찾아보니 append 함수는 값을 반환해 주는 것이 아니라 리스트에 더해주기만 한다고 한다

return 값이 없기 때문에 NULL 로 나오는 것!

 

answer 값에 추가가 안되나 해서 이 뒤에 하나씩 추가를 해주었는데

def solution(arr, divisor):
    answer = []
    for array in arr:
        if array % divisor==0:
            answer.append(array)
        else:
            answer.append(-1)
    return answer

 

이번에는 나누어 떨어지는 값 에 -1 이 섞여져서 나왔다.

구글링을 하다가 조건을 하나 놓친것을 발견!

 

'나누어 떨어지는 수가 하나도 없을때' 라는 조건을 넣어주었다.

def solution(arr, divisor):
    answer = []
    for array in arr:
        if array % divisor==0:
            answer.append(array)
        elif len(answer)==0:   # answer(나누어떨어지는수) 가 하나도 없을 때
            answer.append(-1)
        answer.sort()
    return answer

결과는 같았지만 테스트 1~4, 9~12,14~16 에서 실패..

 

실패이유를 예상해보자면

조건의 순서가 잘못 되었다.

그리고 -1을 넣어줘야 하는 경우에는

나누어 떨어지는 수가 하나도 없을 때이기 때문에 반복문에 넣는 것이 아니었던 것 같다!

 

 

오름차순으로 정렬을 먼저 해주고

그 뒤에 반복문 밖에서 하나도 없는 경우를 배열로 만들어주었다

def solution(arr, divisor):
    answer = []
    for array in arr:
        if array % divisor==0:
            answer.append(array)
        answer.sort()
    if len(answer)==0:
        answer.append(-1)
    return answer

드디어 완성!

 

def solution(arr, divisor):
    answer = []
    for array in arr:
        if array % divisor==0:
            answer.append(array)
    if len(answer)==0:
        answer.append(-1)
    answer.sort()
    return answer

 

* 이렇게 정렬순서를 아래로 넣어봤는데도 테스트가 통과되었던 것으로 보아

2번째 조건인 나누어떨어지는 수가 하나도 없을때 라는 조건이 반복문 밖에서 해줬어야 했기 때문인 듯 하다

 

 

 


  • 내일 진행 예정

1. SQL 코드카타 복습

2. 알고리즘 코드카타 복습

'TIL' 카테고리의 다른 글

2024-04-08  (0) 2024.04.08
2024-04-05  (0) 2024.04.05
2024-04-03  (0) 2024.04.03
2024-04-02  (0) 2024.04.02
2024-04-01  (0) 2024.04.01