TIL No.15: Python - 알고리즘 10문제.

BLAKE KIM·2020년 7월 7일
0

소수 찾기

효율성이 떨어져서 통과받지 못한 내 코드

def solution(n):
    count = 1
    for i in range(2, n+1):
        m = int(i**0.5)
        for j in range(2, m+1):
            if i%j == 0:
                count += 1
                break
    answer = n - count
    return answer

에레토스테네스의 체 이용한 코드

def solution(n):
    sieve = [True] * (n+1)
    m = int(n ** 0.5)
    for i in range(2, m + 1):
        if sieve[i] == True:      
            for j in range(i+i, n+1, i): 
                sieve[j] = False

    return len([i for i in range(2, n+1) if sieve[i] == True])

다른 사람의 풀이

def solution(n):
    num=set(range(2,n+1))

    for i in range(2,n+1):
        if i in num:
            num-=set(range(2*i,n+1,i))
    return len(num)
  • set()은 집합 자료형으로 많은 자료를 한 번에 집어 넣을 수 있다. set()의 특징은 1.중복을 허용하지 않으며 2.순서가 없다. 즉 인덱스 값을 이용하기 위해서는 list나 tuple로 변환 후 사용해야한다.
  • range(2*i,n+1,i)는 2*i를 시작으로 i만큼 커지면서 n까지의 범위에 해당하는 수를 말한다. 즉 2*i부터 i의 배수를 num에서 빼는 코드이다.
  • all()은 iterable 자료형을 인수로 받아서 모든 요소의 값이 참이면 True를, 거짓이면 False를 반환한다. 즉 리스트, 튜플, 문자열, 딕셔너리, 집합 등의 자료형을 인수로 받는다.(다른 답변에서 사용)

수박수박수박수박수박수?

내 코드

def solution(n):
    str = ""
    for i in range(n):
        if (i+1)%2 == 1:
            str = str + "수"
        else:
            str = str + "박"
    answer = str
    return answer

다른 사람의 풀이

def solution(n):
    s = "수박" * n
    return s[:n]
  • 슬라이싱 개념을 이해하면 역시나 편하다. 삶의 질이 달라질 듯ㅎㅎ

문자열을 정수로 바꾸기

내 코드

def solution(s):
    k = int(s)
    return k

다른 사람의 풀이

def solution(str):
    result = 0
    for idx, number in enumerate(str[::-1]):
        if number == '-':
            result *= -1
        else:
            result += int(number) * (10 ** idx)
    return result
  • enumerate()는 순서가 있는 자료형(리스트, 튜플, 문자열)을 인수로 받아 인덱스 값을 포함하는 enumerate 객체를 돌려준다.
  • str[::-1]은 뒤에서부터 앞으로 가져오도록 한다.
  • else부분은 각 자리 수에 맞추어 주는 코드이다.
    (멋있어서 가져옴)

시저 암호

내 코드

def solution(s, n):
    k = ""
    for i in range(len(s)):
        if s[i] == " ":
            k += " "
        else:
            if ord(s[i]) >= 65 and ord(s[i]) <= 90:
                if ord(s[i])+n >= 65 and ord(s[i])+n <= 90:
                    k += chr(ord(s[i])+n)
                else:
                    k += chr(ord(s[i])+n-26)
            elif ord(s[i]) >= 97 and ord(s[i]) <= 122:
                if ord(s[i])+n >= 97 and ord(s[i])+n <= 122:
                    k += chr(ord(s[i])+n)
                else:
                    k += chr(ord(s[i])+n-26)
                
    answer = k
    return answer

다른 사람의 풀이

def solution(s, n):
    s = list(s)
    for i in range(len(s)):
        if s[i].isupper():
            s[i]=chr((ord(s[i])-ord('A')+ n)%26+ord('A'))
        elif s[i].islower():
            s[i]=chr((ord(s[i])-ord('a')+ n)%26+ord('a'))

    return "".join(s)
  • isupper(), islower()을 통해 대소문자 여부를 boolean값으로 반환할 수 있다.

약수의 합

내 코드

def solution(n):
    list = []
    for i in range(n):
        if n%(i+1) == 0:
            list.append(i+1)
    return sum(list)

다른 사람의 풀이

def solution(n):
    return sum([i for i in range(1,n+1) if n%i==0])
  • list comprehension을 쓰면 한 줄로 쓸 수 있다.

이상한 문자 만들기

내 코드

def solution(s):
    list = []
    answer = ""
    for i in s:
        list.append(i)
    j = 0
    for i in range(len(list)):
        if list[i] == " ":
            answer += list[i]
            j = 0
        elif j%2 == 0:
            answer += list[i].upper()
            j += 1
        else:
            answer += list[i].lower()
            j += 1
    return answer

다른 사람의 풀이

def solution(s):
    return ' '.join([''.join([c.upper() if i % 2 == 0 else c.lower() for i, c in enumerate(w)]) for w in s.split(" ")])
def solution(s):
    return " ".join(map(lambda x: "".join([a.lower() if i % 2 else a.upper() for i, a in enumerate(x)]), s.split(" ")))
  • map(f, iterable)은 함수(f)와 반복 가능한(iterable) 자료형을 입력으로 받는다. map은 입력받은 자료형의 각 요소를 함수 f가 수행한 결과를 묶어서 돌려주는 함수이다.

자릿수 더하기

내 코드

def solution(n):
    k = str(n)
    sum = 0
    for i in k:
        sum += int(i)
    return sum

다른 사람의 풀이

def solution(number):
    return sum([int(i) for i in str(number)])
def sum_digit(number):
    if number < 10:
        return number;
    return (number % 10) + sum_digit(number // 10)
  • 두 번째 풀이는 재귀함수에 대한 내용으로 함수 내에서 현재 정의하는 함수를 호출하는 것이다.

자연수 뒤집어 배열로 만들기

내 코드

def solution(n):
    k = str(n)
    answer = []
    for i in k:
        answer.append(int(i))
    answer.reverse()
    
    return answer

다른 사람의 풀이

def digit_reverse(n):
    return list(map(int, reversed(str(n))))

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

내 코드

def solution(n):
    k = str(n)
    s = ""
    list = []
    for i in k:
        list.append(i)
    list.sort(reverse = True)
    for i in list:
        s += i
    answer = int(s)
    return answer

다른 사람의 풀이

def solution(n):
    return int("".join(sorted(list(str(n)), reverse=True)))

정수 제곱근 판별

내 코드

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

다른 사람의 풀이

def solution(n):
    sqrt = n ** (1/2)
    if sqrt % 1 == 0:
        return (sqrt + 1) ** 2
    return -1
def solution(n):
    return int(n**0.5+1)**2 if n == int(n**0.5)**2 else -1
  • 함수 내에서 return을 하면 함수는 해당 시점에서 종료한다.
profile
BackEnd

0개의 댓글