알쿼리즘: 파이썬 코드훈련 19, 20, 21번

2024. 7. 1. 15:03전처리/PYTHON

 

01 정수의 제곱근 판별


나의 코드: 비모듈, 바로 떠올릴 수 있던 로직이나 숫자가 커질수록 비효율적이다.

def solution(n):
    for i in range(1, n+1):
        if i**2 == n:
            return (i+1)**2
    return -1

멘토님 코드: 정수를 판별하는 if문으로 2가지 경우의 수를 사용할 수 있다.

import math
def solution(n):
    # 어떤 숫자가 주어졌을 때 제곱근이 없다는게 대부분의 경우
    # 따라서 기본 정답을 -1 로 정하고 시작하는것.
    answer = -1
    
    n_sqrt = math.sqrt(n)
    
    # 만약 제곱근 쓴 숫자가 정수라면 정답
    if n_sqrt.is_integer():
        answer = n_sqrt
        return (answer + 1)**2

    # 또는 다음과 같이 판별: 1/2제곱값이 정수일 때
    # if int(n**0.5) == n**0.5:
    return answer

팀원 코드(1): 제곱근의 정수를 구하고 이것의 제곱이 실제 n값과 같은지 확인한다.

import math
def solution(n):
    answer =  int(math.sqrt(n))
    # 제곱근을 제곱하면 실제로 n이 나오는가에서 정답이 갈린다.
    if n == answer ** 2:
        return (answer + 1) ** 2
    else:
        return -1

팀원 코드(2): 제곱근을 1로 나눈 나머지가 0이면 정수, 아니면 -1을 출력한다.

def solution(n):
    root = n**0.5
    # 나머지로 정수 판별
    if root%1 == 0:
        return (root+1)**2
    else:
        return -1

결론: 제곱근이 정수라면? or 제곱근과 number의 직접 비교하는 두 가지의 경우의 수가 있음.

 

02 인사이트


1. math.sqrt(number)에서 sqrt는 square root의 약자로 제곱근을 계산하는 함수이다.

2. is_integer() 정수인지 아닌지 참과 거짓을 판별해준다.

3. number**0.5로 제곱근을 판별하는데 사용할 수 있다.

 

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


def solution(n):
    answer = list(reversed(sorted(str(n))))
    return int(''.join(answer))

- sorted(str(n))은 문자열 데이터를 정렬된 리스트로 바꿔서 출력한다.

- sorted는 기존의 배열을 건드리지 않는다. 정렬 후 return을 한다. 때문에 정렬 결과가 print 된다.

- sort()는 기존의 배열을 수정한다. print하면 None이 뜬다. reverse=True 파라미터가 있다.

 

04 하샤드 수


나의 코드: list(map(int, str(x)))를 이용해서 숫자의 자릿수별 리스트를 만들었다.

def solution(x):
    number = list(map(int, str(x)))
    if x % sum(number) == 0:
        return True
    else:
        return False

멘토님 코드

def solution(x):
    # 기능1) 자릿수의 합을 기능을 구현(ex 18 -> 1 + 8 -> 9 )
    # 변수 sum
    # 몫/나머지 기능 내장함수, 연산자(//, %)
    # 자릿수의 합을 구하기 위해서 무한대로 나눠야할 수도있으나
    # 10000이므로 최대 4번까지만 나누면 될듯 
    # 이방식은 while
    n = x # 처음 들어온 수를 따로 저장
    sum = 0

    while x >10:
        remain = x % 10  # 나머지: 한자리수 특징
        x = x // 10
        sum = sum + remain
        # print("나머지",remain,"몫", x, "합", sum) # 루프마다 진행되는 진척을 확인
    sum = sum + x #sum : 문제에서 요구하는 자릿수의 합
    
    # 기능2) x를 a로 나눠서 나누어 떨어지는지 체크
    if n % sum == 0: # 나누어 떨어진다면
        return True
    else:
        return False

팀원 코드

def solution(x):
    return x%sum(map(int, str(x))) == 0

- 비교연산자(==) 혹은 논리연산자의 결과가 항상 불리언 값임을 잊지 말자.

- 예를 들어, 3==2를 실행하면 False를 출력한다.

 

05 문제 링크


19번 코딩테스트 연습 - 정수 제곱근 판별

20번 코딩테스트 연습 - 정수 내림차순으로 배치하기

21번 코딩테스트 연습 - 하샤드 수