240717

Gi Woon Lee·2024년 7월 17일
0

TIL

목록 보기
19/78

Python

33번. 약수의 개수와 덧셈

  • 나의 오답... 좋은 시도
def solution(left, right):
    measure = []
    for x in range(left, right+1):
        for i in range(1, x+1):  
            if x % i == 0:              # 약수 찾기
                measure.append(i)
        if len(measure) % 2 == 0:       # 약수 개수 점검
            return x
        else:
            return -x

약수 리스트 measure를 만들어 담아낸 후, 해당 약수의 짝/홀 여부를 필터링하다가 실패했다.

feedback
1. 약수의 개수:
measure리스트는 매 반복마다 초기화되지 않아 약수가 계속 누적됨
2. return 위치:
return문이 for 루프 안에 있어서 첫 번째 결과를 계산한 뒤 바로 함수가 종료된다. 즉 누적된 결과를 계산하지 못한다.


  • 정답 코드
def count_division(n):  # 약수 개수
    count = 0
    for i in range(1, n+1): # range(n)은 '0' ~ 'n-1' 까지의 숫자를 생성. i로 나눌 시 ZeroDivisionError 발생, 시작 범위를 정해줘야함. 
        if n % i == 0:      # i 를 계속 1로 써서 모든 경우를 count+1 해버렸다..
            count += 1
    return count

def solution(left, right):
    result = 0   # 자꾸 sum 쓰려고 하는데, for문에서는 sum 말고 변수 선언과 += 를 통해 iteration 별 sum을 수행하라.  
    for x in range(left, right+1):
        if count_division(x) % 2 == 0:  # 짝수면
            result += x
        else:                           # 홀수면
            result -= x
    return result
  1. 약수의 개수를 구하는 함수를 따로 정의하여 편리하게 사용했다.
    sql에서 cte의 역할을 하는 def 함수를 적극 활용하자.

  2. ZeroDivisionError 를 주의하자. range(n)은 '0' ~ 'n-1' 까지의 숫자를 생성한다. 따라서 나눗셈의 경우 시작을 명시해줌으로써 ZeroDivisionError를 피해야 할 것이다.

  3. 반복문을 통한 누적 덧셈이 필요할 땐, sum 이 아니라 변수선언과 =+를 통한 iteration별 합계를 사용해야 한다.


  • 멋진 답 (제곱근을 사용한 약수 개수의 홀-짝 여부 확인하기)
def solution(left, right):
    answer = 0
    for i in range(left,right+1):
        if int(i**0.5)==i**0.5:     # 제곱수인지 확인! 
            answer -= i
        else:
            answer += i
    return answer

int(i**0.5) == i**0.5 는 'i'가 제곱수인지 아닌지 확인한다.

"제곱수는 약수 커플 중 쌍둥이를 갖는다."
일반적으로 숫자 n의 약수는 쌍을 이룬다.
ex)
36의 약수: (1, 36), (2, 18), (3, 12), (4, 9), (6, 6)
-> 쌍둥이 커플(6, 6)을 갖고 개수는 홀수이다.
20의 약수: (1, 20), (2, 10), (4, 5)
-> 약수들이 서로 다른 쌍을 이루며 개수는 짝수이다.

34번. 문자열 내림차순 정렬

def solution(s):
    answer = "".join(sorted(s, reverse=True))
    return answer
    
# s: "Zbcdefg"
# 결과: "gfedcbZ"

문자열 매서드 join()과 sorted함수를 적절히 사용하였다.

sort와 sorted의 차이가 헷갈렸다.

이 문제에서는 input값이 str 이라서 sorted()함수를 사용했다.

sort VS sorted
sort: 리스트 객체 메서드. 리스트를 직접 수정.
sorted: 일반 함수. literable 객체(튜플, 문자열..)에 사용 가능. 정렬된 리스트를 반환.

35번. 부족한 금액 계산하기

  • 나의 오답
def solution(price, money, count):
    fee = 0
    for i in range(1, count + 1):
        fee = fee + (price * i)
    return abs(money-fee)

다 잘 해놓고 문제 마지막 줄 "단, 금액이 부족하지 않으면 0을 return 하세요."를 안읽어서 오래걸렸다.

문제 똑바로 읽어라


  • 정답
def solution(price, money, count):
    fee = 0
    for i in range(1, count + 1):
        fee = fee + (price * i)
    if money-fee > 0:
        return 0
    else:
        return abs(money-fee)

절댓값 abs()가 사용된 문제였다.

36번. 문자열 다루기 기본

  • 나의 오답
def solution(s):
    if (len(s) == 4 or 6) and s.isdigit(): 
        return True
    else:
        return False

...틀린이유
1. 컴퓨터 이해 능력 이슈:
len(s) = 4 or 6 을 컴퓨터는 4 or True 로 인식한다.
컴퓨터는 0 아니면 전부 True로 해석하며 병렬정 이해를 하지 못한다.
또한 ==or보다 연산 속도가 빠르다.


  • 정답 by 임정 튜터
def solution(s):
    if len(s) == 4 or len(s) == 6:
        return s.isdigit()
    else:
        return False # 반드시 명시 필요

오답 원인을 제거하고 len(s) == 6을 명시했다.

또한 len(s) == 5인 경우 True로 해석하기 때문에 return s.isdigit()에서 끝내면 안되고 else조건을 걸어 false조건을 명시해줘야 한다.


  • 팀원의 정답
def solution(s):
    return s.isdigit() if len(s) == 4 or len(s) == 6 else false 

: 삼항 연산자를 사용하여 간단하게 풀었다.


  • 멋진 정답
def alpha_string46(s):
    # 함수가 주어진 문자열 s가 숫자로만 이루어져 있는지와 길이가 4 또는 6인지 확인합니다.
    return s.isdigit() and len(s) in [4, 6]

# 테스트 코드
print(alpha_string46("a234"))  # False
print(alpha_string46("1234"))  # True

and로 두 개의 조건을 연결하고, in 연산자를 통해 문자열의 길이 조건 명시했다.
논리연산자만을 사용한 깔끔한 코드.

37번. 행렬의 덧셈

def solution(arr1, arr2):
    answer = []
    
    for i in range(len(arr1)):  # 행의 합
        arr_sum = []
        for j in range(len(arr1[0])):   # 열의 합
            arr_sum.append(arr1[i][j] + arr2[i][j])
        answer.append(arr_sum)
    
    return answer

개념

[Python] sort(), sorted() method

sort(): 리스트 객체 메서드, 기존 객체를 정렬
sorted(): iterable 객체(튜플, 문자열 등) 메서드, 정렬된 new 리스트를 반환하며 기존 객체는 변하지 않음

sort, sorted 비교 예시

# sort() 예시
numbers = [3, 1, 4, 1, 5, 9]
numbers.sort()
print(numbers)  # 출력: [1, 1, 3, 4, 5, 9]
---
# sorted() 예시
numbers = [3, 1, 4, 1, 5, 9]
sorted_numbers = sorted(numbers)
print(numbers)  # 출력: [3, 1, 4, 1, 5, 9]
print(sorted_numbers)  # 출력: [1, 1, 3, 4, 5, 9]
  • syntax
    numbers.sort(reverse, key)
    reverse: 오름차순:reverse=False 디폴트. 내림차순:reverse=True
    key: 정렬 기준을 정하는 함수. ex) len, lambda...

[Python] 함수와 매서드의 차이

  • 메서드 (Method): 객체를 대상으로 종속적으로 작동. 점 표기
    object.method_name()

  • 함수 (Function): 어디서든 독립적으로 작동하는 코드. 괄효 표기
    function()

Functions are independent blocks of code that can be called from anywhere, while methods are tied to objects or classes and need an object or class instance to be invoked

[Python] 삼항연산자

삼항 연산자(ternary operator):
syntax -> True 값 if 조건 else False 값

삼항연산자 활용 예시
ex-1)

# 홀/짝 판별
number = 5
result = "Even" if number % 2 == 0 else "Odd"
print(result)  # 출력: Odd

ex-2)

age = 18
message = "Adult" if age >= 18 else "Minor"
print(message)  # 출력: Adult

0개의 댓글