programmers(20-34)level_1완료

문제: 20. 자릿수 더하기

자연수 N이 주어지면, 각 자릿수의 합을 구해서 리턴하는 함수

def solution(n):
    return sum(list(map(int, list(str(n)))))

다른 사람 풀이

    return sum(map(int,str(number)))

굳이 list에 담아주지 않고도, sum을 바로 해줄 수 있다.

  • Q) map은 왜 map 객체를 반환할까?
  • iterator이기 때문이다. iterator란 반복가능한 객체, 즉 반복문을 활용해서 데이터를 순회하면서 처리하는 것을 말한다.

-

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

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

다른 사람 풀이

def solution(n):
    return list(map(int, reversed(str(n))))
  • string은 먼저 뒤집을 수 있다.

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

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

23. 정수 제곱근 판별

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

다른 사람 풀이 보기

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

    if sqrt % 1 == 0:
        return (sqrt + 1) ** 2
    return 'no'
  • 파이썬에서는 제곱근을 찾는 연산으로 **을 제공한다.

24. 제일 작은 수 제거하기

def solution(n):
    n.remove(min(n))
    return [-1] if not n else n

25. 짝수와 홀수

    return "Even" if num % 2 == 0 else "Odd"

26. 최대 공약수와 최소 공배수

  • 유클리드 호제법을 알면 편하다.
  • 호제법이란 말은 두 수가 서로 상대방 수를 나누어서 결국 원하는 알고리즘을 나타낸다.
  • 예를 들어 1071과 1029의 최대 공약수를 구해보면
  • 1071은 1029로 나누어 떨어지지 않기 때문에 1071을 1029로 나눈 나머지를 구한다 -> 42
  • 1029는 42로 나누어 떨어지지 않기 때문에 1029를 42로 나눈 나머지를 구한다 -> 21
  • 42는 21로 나누어 떨어진다. 따라서 최대 공약수는 21이다.

  • 이를 이용해서 최대 공약수를 구한 뒤, 최소 공배수는 두수 a,b의 곱을 최대공약수로 나누기만 하면 된다.
def gcd(m, n):
    while n != 0:
        t = m % n
        (m, n) = (n, t)
    return abs(m)


def solution(n, m):
    T = gcd(n, m)
    lcm = int(n*m/T)
    return [T, lcm]

27. 콜라츠 추측

콜라츠 추측이란 주어진 수가 1이 될 때까지 다음 작업을 반복하면, 모든 수를 1로 만들 수 있다는 추측이다.

1-1. 입력된 수가 짝수라면 2로 나눈다.
1-2. 입력된 수가 홀수라면 3을 곱하고 1을 더한다.
2-0. 결과로 나온 수에 같은 작업을 1이 될 때까지 반복한다.

예를 들어 입력된 수가 6이라면 6->3->10->5->16->8->4->2->1이 되어 총 8번 만에 된다. 단 500번을 반복해도 1이 되지 않는다면 -1을 반환

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

28. 평균 구하기

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


print(solution([1, 2, 3, 4]))

29. 하샤드 수

양의 정수 x가 하샤드 수 이려면 x의 자릿수의 합으로 x가 나누어져야 한다.

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

30. 핸드폰 번호 가리기

def solution(x):
    return "*"*(len(x)-4) + x[-4:]
print(solution("0277"))

31. 행렬의 덧셈

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

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

def solution(x, n):
    num = x
    result = [x]
    for i in range(n-1):
        num += x
        result.append(num)
    return result

다른 사람 풀이

def number_generator(x, n):
    # 함수를 완성하세요
    return [i for i in range(x, x*n+1, x)]

# 아래는 테스트로 출력해 보기 위한 코드입니다.
print(number_generator(2,5))
  • range() 함수에x를 3번째 인자로 넣어서 활용이 가능하다.

33. 직사각형 별찍기

n, m = map(int, input().strip().split(' '))

for i in range(m):
    print("*"*n)

다른 사람 풀이

a, b = map(int, input().strip().split(' '))
answer = ('*'*a +'\n')*b
print(answer)
  • ‘\n’도 만들어서 찍어주면 그만이다.

34. 예산

  • 동전 거스름돈 그리디 문제랑 똑같은 것 같다.
def solution(d, budget):
    d.sort()
    maxSum = 0
    count = 0
    for idx, i in enumerate(d):
        maxSum += i
        if (maxSum <= budget):
            count += 1
        else:
            break
    return count

참고자료 [유클리드 호제법]https://ko.wikipedia.org/wiki/%EC%9C%A0%ED%81%B4%EB%A6%AC%EB%93%9C_%ED%98%B8%EC%A0%9C%EB%B2%95 [최대공약수/최소공배수]http://blog.naver.com/PostView.nhn?blogId=fldragonn&logNo=220800294793&parentCategoryNo=&categoryNo=37&viewDate=&isShowPopularPosts=false&from=postView

0%