TIL - Algorithms

Seob·2020년 7월 8일
0

Algorithms

목록 보기
3/8
post-thumbnail

오늘 푼 알고리즘으로 프로그래머스 레벨 1 연습문제를 모두 풀었다.👏🏻
오늘 푼 문제들은 어제보다 쉬웠던것 같다. 👀

제일 작은 수 제거하기

내가 작성한 답

def solution(arr):
    if len(arr) > 1:
        arr.remove((min(arr)))
        return arr
    else:
        return [-1]

다른 사람의 답

def rm_small(mylist):
    return [i for i in mylist if i > min(mylist)]

💬

  • 다른 사람의 답은 [-1]을 리턴하지 않는데 왜 추천수가 제일 높은지 모르겠다(?)
  • 다른 사람의 답 처럼 한줄에 다 적어보려고 했는데 뜻처럼 되지 않는다. 😔

짝수와 홀수

내가 작성한 답

def solution(num):
    return 'Even' if num%2 == 0 else 'Odd'

다른 사람의 답

def evenOrOdd(num):
    if (num%2):
        return "Odd"
    else:
        return "Even"

💬

  • 다른 사람의 답은 True / False를 이용했는데 한줄로 할 때도 응용할 수 있겠다고 생각한다.

최대공약수와 최소공배수

내가 작성한 답

answer = []
def gcd(n, m):
    # 유클리드 호제법
    if n < m:
        n, m = m, n
    remainder = n % m
    while remainder != 0:
        n = m
        m = remainder
        remainder = n % m
    gcd = m
    answer.append(gcd)
    return gcd

def solution(n, m):
    answer.append(n*m/gcd(n, m))
    return answer

다른 사람의 답

def gcdlcm(a, b):
    c, d = max(a, b), min(a, b)
    t = 1
    while t > 0:
        t = c % d
        c, d = d, t
    answer = [c, int(a*b/c)]

    return answer

💬

  • 최대공약수를 구하는 함수를 만들어서 최소공약수를 구했다.
  • 다른 사람의 답은 maxmin함수로 큰수와 작은수를 구분해주고 while loop에서 스왑하여 깔끔하게 코드를 작성했다.

콜라츠 추측

내가 작성한 답

def solution(num):
    answer = 0
    count = 0
    while num != 1 and count<500:
        if num%2 == 0:
            num = num/2
        else:
            num = num*3+1
        count += 1
    if count == 500:
        return -1
    else:
        answer = count
        return answer
    return answer

다른 사람의 답

def collatz(num):
    for i in range(500):
        num = num / 2 if num % 2 == 0 else num*3 + 1
        if num == 1:
            return i + 1
    return -1

💬

  • for문 을 썼으면 count변수가 필요 없었다.. 조건문 부분이 같았던 거로 만족쓰,,🙈
  • 간단한 조건문은 한줄로 적는 방법에 익숙해져야겠다.

평균 구하기

내가 작성한 답

def solution(arr):
    return sum(arr)/len(arr)

다른 사람의 답

def average(list):
    return (sum(list) / len(list))

💬

  • 이번 문제는 너무 간단했고 추천수가 가장 높던 답과 같았다. 🙌🏻

하샤드 수

내가 작성한 답

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

다른 사람의 답

def Harshad(n):
    return n % sum([int(c) for c in str(n)]) == 0

💬

  • True/False를 반환 하려고 조건문부터 생각했는데 다른 사람의 답을 보니 내가 생각했던 것 보다 더 단순해서 놀랐다..
  • 알고리즘을 시작한 후로 의도적으로 map함수를 쓰고 있는것 같다.

핸드폰 번호 가리기

내가 작성한 답

def solution(phone_number):
    return phone_number.replace(phone_number[:-4], '*'*len(phone_number[:-4]))

다른 사람의 답

def hide_numbers(s):
    return "*"*(len(s)-4) + s[-4:]

💬

  • 다른 사람의 답에서는 replace하지 않고 그냥 별을 붙여줬다.
  • 어느쪽이 더 효율적인지는 모르겠다.

행렬의 덧셈

내가 작성한 답

def solution(arr1, arr2):
    answer = []
    for i in range(len(arr1)):
        temp=[]
        for j in range(len(arr1[0])):
            temp.append(arr1[i][j]+arr2[i][j])
        answer.append(temp)
    return answer

다른 사람의 답

def sumMatrix(A,B):
    answer = [[c + d for c, d in zip(a, b)] for a, b in zip(A,B)]
    return answer

💬

  • 조금만 복잡해져도 한줄로 적기가 힘들어진다. 😅
  • for loopappend를 보면 한줄로 적어보도록 노력해야겠다.

x만큼 간격이 있는 n개의 숫자

내가 작성한 답

def solution(x, n):
    return [i*x+x for i in range(n)]

다른 사람의 답

def number_generator(x, n):
    return [i * x + x for i in range(n)]

💬

  • 이번 문제도 간단했고 다른 사람의 답이랑 똑같았다. 🎉

직사각형 별찍기

내가 작성한 답

a, b = map(int, input().strip().split(' '))
for i in range(b):
    print('*'*a)

다른 사람의 답

a, b = map(int, input().strip().split(' '))
answer = ('*'*a +'\n')*b
print(answer)

💬

  • 다른 사람의 답에서는 마지막에 개행 한 줄이 생기는데 괜찮은지 모르겠다
  • 특정 모양이 아니라 직사각형이라 간단히 해결했다.
profile
Hello, world!

0개의 댓글