TIL

3주차 목요일

whateveryouwish 2024. 7. 18. 16:28

 

알고리즘

7번

내배캠 코드카타 알고리즘 문제 7

 

def solution(num1, num2):
    answer = (num1 / num2) * 1000
    answer = int(answer)
    
    
    return answer

 

나눗셈을 묻는 문제였지만,

answer를 정수로 변환시켜야 풀리는 문제였다.

 

int(answer)를 하면 그냥 정수로 변환되는 걸로 알았는데

다시 answer 변수에다 저장을 해야한다.

 

이 코드보다 더 효율적인 코드가 있는데,

 

def solution(num1, num2):
    return int(num1 / num2 * 1000)

 

아름답다고 생각한다.

 

8번

내배캠 알고리즘 문제 8번

 

def solution(angle):
    answer = 0
    if 0 < angle < 90:
        answer = 1
    elif angle == 90:
        answer = 2
    elif 90 < angle < 180:
        answer = 3
    else:
        answer = 4
    return answer

 

아주 기본적으로 푼 게 아닐까 싶다.

 

그러고나서 좋은 풀이를 보았는데,

 

def solution(angle):
    answer = (angle // 90) * 2 + (angle % 90 > 0) * 1
    return answer

 

!?

 

...

 

각 'angle'이 예각인 경우(ex: 60도) 연산자 '+' 앞부분은 0이 되고

뒷부분은 나머지 연산자 '%'를 통해 angle이 0보다 크므로 'True'가 되어 1이 된다.

결과값 : 1

 

'angle'이 직각인 경우 앞부분은 2가 되고

뒷부분은 나머지가 0이므로 'False'가 되어 0이 된다.

결과값 : 2

 

'angle'이 둔각인 경우 앞부분은 2가 되고

뒷부분은 angle이 0보다 크므로 'True'가 되어 1이 된다.

결과값 : 3

 

'angle'이 평각일 경우 앞부분은 4가 되고

뒷부분은 나머지가 0이므로 'False'가 되어 0이 된다.

결과값 : 4

 

Damn...

 

def solution(angle):
    if angle<=90:
        return 1 if angle<90 else 2
    else:
        return 3 if angle<180 else 4

 

이것도 굉장히 좋은 코드 같다.

 

9번

 

9번

 

 

def solution(n):
    answer = 0
    #50이 주어지면 50 48 46 ... 
    #49가 주어지면 48 46
    if n % 2 == 0:
        answer = n*(n+1)//2 - n**2//4
    else:
        answer = n*(n-1)//2 - (n-1)**2//4
            
    return answer

 

간단한 문제인데, 종이랑 펜이 없어서 ... 30분이나 걸렸다...

사실 이렇게 풀기보다 range()의 용법을 묻는 문제였을 거 같다.

 

def solution(n):
    return sum([i for i in range(2, n + 1, 2)])

 

아... 역시나...

 

def solution(n):
    return 2*(n//2)*((n//2)+1)/2

 

n*(n+1)/2 가우스의 공식을 활용했다.

 

자세한 설명은 밑에 더보기

더보기
  1. n*(n+1)//2 - n**2//4
    • n*(n+1)//2는 n까지의 자연수들의 합을 나타냅니다.
    • n**2//4는 n까지의 홀수들의 합을 나타냅니다.
    • 따라서 n*(n+1)//2 - n**2//4는 n까지의 짝수들의 합을 나타냅니다.
  2. 2*(n//2)*((n//2)+1)/2
    • n//2는 n을 2로 나눈 몫, 즉 n의 절반을 나타냅니다.
    • ((n//2)+1)은 n의 절반에 1을 더한 값입니다.
    • 2*(n//2)*((n//2)+1)/2는 n의 절반까지의 자연수들의 합을 2배한 값입니다.
    • 이는 n까지의 짝수들의 합과 같습니다.

이를 수식으로 정리하면 다음과 같습니다:

n*(n+1)//2 - n**2//4 = 2*(n//2)*((n//2)+1)/2

즉, 두 공식은 n까지의 짝수들의 합을 나타내는 서로 다른 표현 방식입니다.

첫 번째 공식은 n까지의 자연수들의 합에서 n까지의 홀수들의 합을 빼는 방식이고,

두 번째 공식은 n의 절반까지의 자연수들의 합을 2배하는 방식입니다.

두 공식은 동일한 결과를 도출합니다.

 

10번

 

 

 

def solution(numbers):
    answer = sum(numbers)/len(numbers)
    answer = round(answer, 1)
    return answer

 

round 함수는 안써도 되지만

배우는 김에,

round() 함수는 첫 번째 인자로 반올림할 숫자를, 두 번째 인자로 소수점 이하 자릿수를 지정할 수 있다.

 

def solution(numbers):
    return sum(numbers) / len(numbers)

 

아이고 깔끔해라.

굳이 answer를 도출하라고 할 필요가 없다.

 

11번

 

11번

 

def solution(num):
    if num % 2 == 0:
        answer = 'Even'
    else:
        answer = 'Odd'
    return answer

 

def evenOrOdd(num):
    #함수를 완성하세요
    if num%2:
        return "Odd"

    return "Even"

 

def evenOrOdd(num):
    return num % 2 and "Odd" or "Even"

 

아름다운 풀이 과정이다.

 

파이썬은 () 소괄호를 써서 우선 순위를 지정하는 경우를 빼고는

먼저 쓰여진 대로 우선 순위가 성립한다.

 

and 연산자는 결과값이 둘다 참이어야 True를 출력하고

or은 둘중하나만 참이어도 True를 출력한다.

 

A and B or C

구조라고 보자.

 

num이 짝수여서

num%2(A)가 0이면 0 and B or C 가 된다.

이 때 앞의 B는 and 연산자로 이어져있기에

(and 연산자는 결과값이 둘다 참이어야 True를 출력하기에)

그 값을 처리할 필요도 없이 False로 반환되고

그 다음 or C가 출력되는 것이다.

 

num이 홀수라면

num%2(A)가 1이면 1 and B or C 가 된다.

이 때 B는 비어져있지 않은 문자열이므로 True로 반환되고

1 and 1 or C에서

or 앞부분이 True 이므로 굳이 C를 보지 않고

"odd"를 반환하는 것이다.

 

진짜 머리 깨지겠네 아오

 

암튼

 

or, and 연산자 심화를 확인하고 싶으면 

더보기
  • or
    • A가 Truthy이면 B를 확인하지 않으므로 A가 저장된다.
    • A가 Falsy면 B를 확인하므로 B가 저장된다. (B의 Truthy / Falsy 와 무관하다!)
  • and
    • A가 Truthy면 B를 확인하므로 B가 저장된다. (B의 Truthy / Falsy 와 무관하다!)
    • A가 Falsy면 B를 확인하지 않으므로 A가 저장된다.

 

12번

 

12번 문제

 

def solution(arr):
    return sum(arr)/len(arr)
  •  

배운 건 써먹어야지.

 

13번

 

 

 

 

def solution(n):
    digits = [int(digit) for digit in str(n)]
    return sum(digits)

 

간만에 뿌듯한 코드 작성.

근데 한 40분 걸렸다.

왜 생각한 대로 안나오냐구.

 

def sum_digit(number):
    if number < 10:
        return number

    return number%10 + sum_digit(number//10)

 

이번엔 내가 진짜 똑똑하게 풀었다고 생각했는데

더 직관적인 풀이가 있었다.

재귀함수는 어려운데... 차차 알아가보는 걸로 한다.

 

 

 

 

 

 

 

출처 : https://ryanking13.github.io/2018/04/05/python-truthy-falsey.html

 

파이썬에서의 Truthy Falsy

파이썬의 Truthy와 Falsy 개념을 소개하는 글입니다.

ryanking13.github.io

 

 

SQL

21번

 

 

 

SELECT animal_id
from animal_ins
where name is null
order by animal_id

 

 

22번

 

 

 

 

SELECT count(user_id) as users
from user_info
where age >= 20 and
      age <= 29 and
      joined like '%2021%'
;

 

23번

 

 

더보기

보호소의 동물이 중성화되었는지 아닌지 파악하려 합니다. 중성화된 동물은 SEX_UPON_INTAKE 컬럼에 'Neutered' 또는 'Spayed'라는 단어가 들어있습니다. 동물의 아이디와 이름, 중성화 여부를 아이디 순으로 조회하는 SQL문을 작성해주세요. 이때 중성화가 되어있다면 'O', 아니라면 'X'라고 표시해주세요.

SELECT animal_id,
        name,
        replace(sex_upon_intake, 'Neutered Male', 'O') as "중성화",
        replace(sex_upon_intake, 'Spayed Female', 'O') as "중성화",
        replace(sex_upon_intake, 'Intact Male', 'X') as "중성화"
from animal_ins
order by animal_id

이렇게 풀어보았는데, replace 함수를 쓴 부분이 "중성화"열로 한꺼번에 합쳐지지가 않는다.

순차적으로 바뀔 줄 알았는데

열을 새로 생성해버린다.

 

24번

 

 

 

 

나 그룹바이 몰라...

 

25번

 

 

 

SELECT animal_type, count(animal_type) count
from animal_ins
group by animal_type
order by animal_type
;

 

지금 내가 그룹바이 개념이 제대로 안잡혀있다.

 

26번

 

 

 

SELECT date_format(datetime, '%H') as hour, count(animal_id) as count
from animal_outs
where hour(datetime) between 9 and 19
group by hour
order by hour
;

 

저번에 다윤님이 공유했던 '%H'를 사용하는 쿼리