Python

Python 코드카타 오답: 정수 제곱근 | 결과 정렬하기 | sorted와 list.sort() | 하샤드 수

sawo11 2024. 12. 19. 15:57

[정수 제곱근 판별]

임의의 양의 정수 n에 대해, n이 어떤 양의 정수 x의 제곱인지 아닌지 판단하려 합니다.
n이 양의 정수 x의 제곱이라면 x+1의 제곱을 리턴하고, n이 양의 정수 x의 제곱이 아니라면 -1을 리턴하는 함수를 완성하세요.

# 내가 작성한 코드
# 문제점: x의 제곱이 n인지 확인 후 아니면 바로 -1을 출력
def solution(n):
    answer = 0
    for x in range(1, n + 1):
        if x ** 2 == n:
            answer = (x + 1) ** 2
        else:
            answer = -1
    return answer

# for문 사용
def solution(n):
    for x in range(1, n + 1):
        if x ** 2 == n:  # x의 제곱이 n인지 확인
            return (x + 1) ** 2  # x+1의 제곱 반환
        elif x ** 2 > n:  # x의 제곱이 n을 초과하면 더 이상 확인 필요 없음
            break
    return -1  # 제곱근이 없는 경우
    
# math 모듈 사용
import math # math 모듈 가져오기: 수학 계산을 위한 다양한 함수와 상수 제공

def solution(n):
    sqrt_n = math.sqrt(n)  # n의 제곱근을 구함
    if sqrt_n.is_integer():  # 제곱근이 정수인지 확인
        x = int(sqrt_n)  # 정수로 변환
        return (x + 1) ** 2  # x+1의 제곱 반환
    else:
        return -1  # 제곱근이 정수가 아니면 -1 반환

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

함수 solution은 정수 n을 매개변수로 입력받습니다. n의 각 자릿수를 큰것부터 작은 순으로 정렬한 새로운 정수를 리턴해주세요. 예를들어 n이 118372면 873211을 리턴하면 됩니다.

# for문 사용
def solution(n):
    digits = []  # 자릿수를 저장할 리스트
    for digit in str(n):  # 정수 n을 문자열로 변환하여 각 자릿수를 순회
        digits.append(int(digit))  # 각 자릿수를 정수로 변환하여 리스트에 추가
    
    digits.sort(reverse=True)  # 리스트를 내림차순으로 정렬
    
    result = 0  # 결과값 초기화
    for digit in digits:  # 정렬된 자릿수를 순회하며 정수로 결합
        result = result * 10 + digit  # 자릿수를 왼쪽으로 이동하며 추가
    
    return result


# 간단한 코드
def solution(n):
    # 1. 정수를 문자열로 변환
    # 2. 각 자릿수를 리스트로 분리 후 정렬
    # 3. 정렬된 결과를 다시 하나의 문자열로 결합
    # 4. 문자열을 정수로 변환 후 반환
    return int("".join(sorted(str(n), reverse=True)))

sorted

  • 정렬된 결과를 반환하는 내장 함수
  • 원본 데이터를 변경하지 않고, 정렬된 새로운 객체 반환
sorted(iterable, key=None, reverse=False)

numbers = [3, 1, 4, 1, 5]

# 오름차순 정렬
sorted_numbers = sorted(numbers)
print(sorted_numbers)  # 출력: [1, 1, 3, 4, 5]

# 원본 데이터는 변경되지 않음
print(numbers)  # 출력: [3, 1, 4, 1, 5]

# 내림차순 정렬
sorted_numbers_desc = sorted(numbers, reverse=True)
print(sorted_numbers_desc)  # 출력: [5, 4, 3, 1, 1]

 

list.sort()

  • 리스트의 메서드로, 리스트 객체 자체를 직접 정렬
  • 반환값은 None이며, 원본 리스트 변경
list.sort(key=None, reverse=False)

numbers = [3, 1, 4, 1, 5]

# 오름차순 정렬
numbers.sort()
print(numbers)  # 출력: [1, 1, 3, 4, 5]

# 내림차순 정렬
numbers.sort(reverse=True)
print(numbers)  # 출력: [5, 4, 3, 1, 1]

 

sorted와 sort의 주요 차이점

특징 sorted list.sort
데이터 타입 모든 반복 가능한 객체(iterable) 리스트 전용
원본 데이터 변경되지 않음 원본 데이터가 변경됨
반환값 정렬된 새로운 객체 반환 반환값 없음(None)
유연성 문자열, 튜플 등 다양한 타입 사용 가능 리스트에서만 사용 가능

 

언제 sorted와 sort를 사용할까?

  • sorted:
    • 원본 데이터를 유지해야 하는 경우
    • 리스트 외에 문자열, 튜플 등 다른 반복 가능한 객체를 정렬해야 하는 경우
  • list.sort:
    • 원본 리스트를 직접 정렬해야 하며, 새로운 리스트가 필요하지 않은 경우

[하샤드 수]

양의 정수 x가 하샤드 수이려면 x의 자릿수의 합으로 x가 나누어져야 합니다. 예를 들어 18의 자릿수 합은 1+8=9이고, 18은 9로 나누어 떨어지므로 18은 하샤드 수입니다. 자연수 x를 입력받아 x가 하샤드 수인지 아닌지 검사하는 함수, solution을 완성해주세요.

# for문 사용
def solution(x):
    h = []
    for i in str(x):
        h.append(int(i)) 
    if x % sum(h) == 0:
        answer = True
    else: 
        answer = False
    return answer

# 다른 방식
def solution(x):
    # 1. 자릿수를 리스트로 변환 후 합 계산
    digit_sum = sum(int(i) for i in str(x))
    
    # 2. 하샤드 수 판별
    if x % digit_sum == 0:
        return True
    else:
        return False