TIL - Algorithms

Seob·2020년 7월 7일
1

Algorithms

목록 보기
2/8
post-thumbnail

프로그래머스 level1 연습문제 10개 풀기
오늘 푼 문제들은 어제보다 까다로운 문제가 많았던것 같다.

소수 찾기

다른 사람의 답

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)

💬

  • 에라토스테네스의 체에 대해 알게되었다.
  • 내가 작성한 답은 답은 나왔어도 효율성부분에서 점수를 받지 못했는데 효율성도 생각해봐야겠다.

수박수박수박수박수박수?🍉

내가 작성한 답

def solution(n):
    answer = ''
    s = []
    w = ['수','박']
    for i in range(n):
        s.append(w[i%2])
    answer=''.join(s)
    return answer

다른 사람의 답

def water_melon(n):
    s = "수박" * n
    return s[:n]

💬

  • 문제를 바라보는 시점이 바뀌면 답도 간결해질 수 있다!

문자열을 정수로 바꾸기

내가 작성한 답

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

다른 사람의 답

def strToInt(str):
    result = 0
    for idx, number in enumerate(str[::-1]):
        if number == '-':
            result *= -1
        else:
            result += int(number) * (10 ** idx)
    return result

💬

  • 다른 사람의 답 중 추천수가 가장 높았던 답은 뭔가 복잡했다
  • 그냥 int(s)로 하면 안되는건가..?

시저 암호

다른 사람의 답

def caesar(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)

💬

  • 아스키코드에 대해 알게 되었다.
  • 내부 함수 chr, ord에 대해 정리하자.

약수의 합

내가 작성한 답

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

다른 사람의 답

def sumDivisor(num):
    # num / 2 의 수들만 검사하면 성능 약 2배 향상잼
    return num + sum([i for i in range(1, (num // 2) + 1) if num % i == 0])

💬

  • 리스트를 사용하지 않고 간단하게 결과를 얻을 수도 있었다.
  • 불필요한 코드를 줄여보자.

이상한 문자 만들기

내가 작성한 답

def solution(s):
    answer = ''
    w = ''
    print(s.split())
    for i in s.split():
        for j in range(len(i)):
            if j % 2 == 0:
                w += (i[j:j+1].upper())
            else:
                w += (i[j:j+1].lower())
        w += ' '
    answer = ''.join(w).rstrip()
    return answer

다른 사람의 답

def toWeirdCase(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 toWeirdCase(s):
    return " ".join(map(lambda x: "".join([a.lower() if i % 2 else a.upper() for i, a in enumerate(x)]), s.split(" ")))

💬

  • 내가 작성한 답으로는 100점을 얻을 수 없었다.
  • 틀린 부분을 수정해서 나만의 방식으로 다시 해봐야겠다.

자릿수 더하기

내가 작성한 답

def solution(n):
    answer = 0
    for i in range(len(str(n))):
        answer = answer + int(str(n)[i:i+1])
    return answer

다른 사람의 답

def sum_digit(number):
    if number < 10:
        return number;
    return (number % 10) + sum_digit(number // 10) 
def sum_digit(number):
    return sum([int(i) for i in str(number)])

💬

  • 다른 사람의 답과 비교해보니 불필요해 보이는 부분이 보인다.
  • 클린 코드..!

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

내가 작성한 답

def solution(n):
    answer = list(map(int, reversed(str(n))))
    return answer

다른 사람의 답

def digit_reverse(n):
    return list(map(int, reversed(str(n))))
def digit_reverse(n):
    return [int(i) for i in str(n)][::-1]

💬

  • 처음으로 다른 사람의 답이랑 비슷했던것 같다..!
  • reversereversed의 차이에 대해 정리하자.

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

내가 작성한 답

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

다른 사람의 답

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

💬

  • 어제 풀었던 문제가 생각나서 sorted()함수를 써봤는데 만족스러웠다.

정수 제곱근 판별

내가 작성한 답

import math
def solution(n):
    answer = pow(math.sqrt(n)+1, 2)
    if int(math.sqrt(n)) != math.sqrt(n):
        return -1
    return answer

다른 사람의 답

def nextSqure(n):
    sqrt = n ** (1/2)

    if sqrt % 1 == 0:
        return (sqrt + 1) ** 2
    return 'no'

💬

  • mathimport할 필요가 없었는데..?!
profile
Hello, world!

0개의 댓글