37번. 행렬의 덧셈
행렬의 덧셈은 행과 열의 크기가 같은 두 행렬의 같은 행, 같은 열의 값을 서로 더한 결과가 됩니다. 2개의 행렬 arr1과 arr2를 입력받아, 행렬 덧셈의 결과를 반환하는 함수, solution을 완성해주세요.
def solution(arr1, arr2):
return [[a + b for a,b in zip(a1, a2)] for a1, a2 in zip(arr1, arr2)]
행렬의 같은 위치에 있는 요소들끼리의 합산이므로 각 행렬의 요소들을 연산하기 위해서 zip을 사용했다.
38번. 직사각형 별찍기
이 문제에는 표준 입력으로 두 개의 정수 n과 m이 주어집니다.
별(*) 문자를 이용해 가로의 길이가 n, 세로의 길이가 m인 직사각형 형태를 출력해보세요.
a, b = map(int, input().strip().split(' '))
for i in range(1, b+1):
print('*' * a)
# 다른 사람들의 풀이 중, for문 없이 하는 법
a, b = map(int, input().strip().split(' '))
answer = ('*'*a +'\n')*b
print(answer)
39번. 최대공약수와 최소공배수
두 수를 입력받아 두 수의 최대공약수와 최소공배수를 반환하는 함수, solution을 완성해 보세요. 배열의 맨 앞에 최대공약수, 그다음 최소공배수를 넣어 반환하면 됩니다. 예를 들어 두 수 3, 12의 최대공약수는 3, 최소공배수는 12이므로 solution(3, 12)는 [3, 12]를 반환해야 합니다.
def solution(n, m):
n, m = min(n, m), max(n, m) # 뒤가 더 큰수라고 고정
for i in range(n, 0, -1): # n 부터 1까지 거꾸로 반복하면서
if n % i == 0 and m % i == 0: # n과 m의 최대공약수 찾기
gcd = i
break
lcm = (n * m) // gcd # 최소공배수 공식사용
return [gcd, lcm]
근데 이걸 lambda로 표현한 천재적인 코드가 있다.....진짜 벽을 느낀다 오늘도
def solution(n, m):
gcd = lambda a,b : b if not a%b else gcd(b, a%b)
# a%b == 0이 아니면 a에 b를 넣고 b에 a%b (a를 b로 나눈 나머지)를 다시 넣는 걸 반복하는..하... 이게 내가 위에서 쓴거다...
lcm = lambda a,b : a*b//gcd(a,b)
return [gcd(n, m), lcm(n, m)]