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

BLAKE KIM·2020년 7월 12일
0

제일 작은 수 제거하기

내 코드

def solution(arr):
    answer = []
    if len(arr) == 1:
        answer = [-1]
    else:
        minNum = None
        for i in arr:
            if minNum == None or minNum > i:
                minNum = i
        for i in range(len(arr)):
            if arr[i] == minNum:
                arr.pop(i)
                break
        answer = arr
    return answer

다른 사람의 풀이

def solution(arr):
    if len(arr) > 1: arr.remove(min(arr))
    else: arr = [-1]
    return arr
  • remove()는 list에서 괄호 안의 요소를 삭제한다. 값을 반환하지는 않기 때문에 return에 바로 사용하면 None을 반환한다.

짝수와 홀수

내 코드

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

다른 사람의 풀이

def solution(num):
    return "Even" if num%2 == 0 else "Odd"
  • & 연산자는 비트 연산자로 수를 이진법으로 비교한다.

최대공약수와 최소공배수

내코드

def solution(n, m):
    answer = []
    rangenum = 0
    minnum = 0
    maxnum = 1
    if n <= m:
        rangenum = n
        theother = m
    else:
        rangenum = m
        theother = n
    for i in range(2, rangenum+1):
        if n%i == 0 and m%i == 0:
            maxnum = i
    answer.append(maxnum)
    
    if theother%rangenum == 0:
        minnum = maxnum*(theother//rangenum)
    elif theother%rangenum != 0 and maxnum != 1:
        minnum = (theother//maxnum) * rangenum
    else:
        minnum = n*m
       
    answer.append(minnum)
    return answer

다른 사람의 풀이

def solution(n, m):
    c, d = max(n, m), min(n, m)
    t = 1
    while t > 0:
        t = c % d
        c, d = d, t
    answer = [c, int(n*m/c)]

    return answer
  • 유클리드 호제법을 이용한 것으로 최대공약수는 주어진 두 수 중에 큰 수를 작은 수로 나눈 나머지를 다시 큰 수를 나누었던 작은 수를 나머지로 나누고 새로운 나머지를 작은 수를 나누었던 수로 다시 나누는 작업을 반복해서 나머지가 0이 나오는 순간의 나누는 데 이용되는 수가 최대공약수이다. 최소공배수는 주어진 두 수를 곱하고 최대공약수로 나눈 수가 최소공배수이다.

콜라츠 추측

내 코드

def solution(num):
    count = 0
    while num != 1:
        if count == 500:
            count = -1
            break
        elif num%2 == 1:
            num = 3*num + 1
            count += 1
        elif num%2 == 0:
            num = num/2
            count += 1
    
    return count
  • 딱히 괜찮은 다른 사람의 코드가 없었음. 적용할 만한 것은 for문을 딱 500번 돌아가게 하는 것이다. for문은 시작과 끝이 정해져 있고 while은 조건이 잘못되었을 경우 무한루프로 작동할 가능성이 있기 때문이다.

평균 구하기

내 코드

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

하샤드 수

내 코드

def solution(x):
    answer = True
    y = str(x)
    z = 0
    if len(y) > 1:
        for i in range(len(y)):
            z += int(y[i])
        if x%z != 0:
            answer = False
    return answer

다른 사람의 풀이

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

핸드폰 번호 가리기

내 코드

def solution(phone_number):
    list = []
    for i in phone_number:
        list.append(i)
    for i in range(len(list)-4):
        list[i] = "*"
    answer = ""
    for i in list:
        answer += i
    return answer

다른 사람의 풀이

def solution(phone_number):
    return "*"*(len(phone_number)-4) + phone_number[-4:]
  • [-4:]는 뒤에서 4번째 요소부터 마지막 요소까지를 나타낸다.

행렬의 덧셈

내 코드

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

다른 사람의 풀이

def solution(arr1,arr2):
    return [[c + d for c, d in zip(a, b)] for a, b in zip(arr1,arr2)]
  • zip()은 동일한 개수로 이루어진 자료형을 묶어 주는 역할을 하는 함수이다. 행렬로 생각하면 같은 위치에 있는 요소를 묶어주는 함수이다.

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

내 코드

def solution(x, n):
    answer = []
    a = 0
    for i in range(n):
        a += x
        answer.append(a)
    return answer

다른 사람의 풀이

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

직사각형 별찍기

내 코드

a, b = map(int, input().strip().split(' '))
k = ""
for i in range(b):
    for j in range(a):
        k += "*"
    k += "\n"
print(k)

다른 사람의 풀이

a, b = map(int, input().strip().split(' '))
answer = ('*'*a +'\n')*b
print(answer)
  • print문 안에 end=""을 넣으면 개행이 되지 않는다.(다른 풀이)
profile
BackEnd

0개의 댓글