Q. 행렬의 덧셈은 행과 열의 크기가 같은 두 행렬의 같은 행, 같은 열의 값을 서로 더한 결과가 됩니다. 2개의 행렬 arr1과 arr2를 입력받아, 행렬 덧셈의 결과를 반환하는 함수, solution을 완성해주세요.
arr1
arr2
return
[[1,2],[2,3]]
[[3,4],[5,6]]
[[4,6],[7,9]]
[[1],[2]]
[[3],[4]]
[[4],[6]]
def sumMatrix(A,B):
answer = []
for i in range(len(A)):
answer.append([])
for j in range(len(A[0])):
answer[i].append(A[i][j] + B[i][j])
return answer
좋은 풀이는 위의 코드이다. 근데 이해가 안된다...
def solution(arr1, arr2):
answer = []
for i in range(len(arr1)):
a = []
for j in range(len(arr1[0])):
a.append(arr1[i][j]+arr2[i][j])
answer[i].append(a)
return answer
Q. 자연수 n을 뒤집어 각 자리 숫자를 원소로 가지는 배열 형태로 리턴해주세요. 예를들어 n이 12345이면 [5,4,3,2,1]을 리턴합니다.
def solution(n):
m = list(str(n))
num = list(map(int, m))
l = len(m)
a = [0]*l
for i in range(0, l):
for j in range(0, l):
if i != j and i + j == (l-1):
a[i]=num[j]
a[j]=num[i]
elif i == j and i + j == (l-1):
a[i] = num[i]
return a
Sol)
우선 자연수 n이 13569 라 가정한다.
우리는 [9,6,5,3,1]을 결과값으로 출력해야 한다.
n을 각 자리 수마다 쪼개서 리스트에 담았다. 그리고 리스트를 다음과 같이 표현했다.
idx
0
1
2
3
4
값
1
3
5
6
9
결과값을 분석해보면
1과 9가 자리를 바꿨고, 3과 6이 자리를 바꿨다. 다시 말해
n[0]과 n[4]가 자리를 바꿨고, n[1]과 n[3]이 자리를 바꿔야한다.
자리를 바꿔야하는 인덱스들의 공통점은 합이 리스트 n의 길이 (또는 자연수 n이 자릿수) - 1과 같다.
def solution(n):
m = list(str(n)) #자연수 n을 각 자리수마다 쪼개서 list에 담기(문자열로만 담김)
num = list(map(int, m)) #m에 담긴 값을 다시 int로 바꿔 num에 담기
l = len(m) #리스트 m의 길이
a = [0]*l #조건을 비교하여 집어넣을 빈 리스트
for i in range(0, l):
for j in range(0, l):
if i != j and i + j == (l-1): # ex) l=5일 때, i=0, j=4이면
a[i]=num[j] # 자리가 바뀌게끔 a에 추가
a[j]=num[i]
elif i == j and i + j == (l-1): # ex) l=5일 때, i=2, j=2이면
a[i] = num[i] # 자리 바꿈없이 그냥 같은 인덱스에 추가
return a
제한시간은 30분이지만 거진 1시간은 걸린 것 같다. 그래도 이렇게 코드를 전시하는 이유는 너어어어무 뿌듯하기 때문이다!! 물론 효율성은 떨어지는 코드다. reversed() 함수를 사용해도 됐지만 다른 로직으로 구현하고 싶은 욕심이 들어서 효율은 우선 재끼고 결국 만들어냈다!
알고리즘 공부를 제대로 시작한지는 이틀밖에 안됐는데 스스로가 만족스러운 성과를 냈다!! 야호!
class Stack(list):
push = list.append
def peek(self):
return self[-1] # 가장 마지막에 있는 데이터. self.[len(self)-1] 사용도 ㄱㅊ
s = Stack()
s.push(1)
s.push(5)
s.push(10)
print("my stack is:", s) # 스택에 1, 5, 10이 순서대로 쌓임
print("popped value is:", s.pop()) # 맨 위 데이터인 10이 뽑힘
print("my stack is:", s) # [1, 5] 만 남음
print("peeked value is:", s.peek()) # 맨 위의 데이터만 보임
print("my stack is:", s) # pop한건 아니기 때문에 데이터는 그대로
3. python list를 스택으로 활용
s =[]
s.append(1)
s.append(5)
s.append(10)
print("my stack is:", s)
print("popped value is:", s.pop())
print("my stack is:", s)
print("peeked value is:", s[-1]) #인덱스로 픽
print("my stack is:", s)
큐(Queue: 일이 처리되기를 기다리는 리스트)
프로그래밍에서 목록 혹은 리스트에서 접근이 양쪽에서 가능한 구조
FIFO(First-In, First-Out)
put / peek / get 함수가 존재
컨베이어 벨트가 있다. 이 벨트 위에 Box1, Box2, Box3을 순서대로 올리면
Box 3 Box2 Box1
이렇게 되어있을 것이다.
여기에 box4를 넣으면 put
box의 리스트가 [box1, box2, box3, box4] 가 된다.
peek으로 가장 먼저 들어간 box1 확인
get으로 가장 먼저 들아간 box1을 트럭에 실어!
python 큐 구현
1,2,3 구현 모두 같은 output을 보인다.
1. 직접구현
class Queue(list):
put = list.append
def peek(self):
return self[0] # 가장 앞에 있는 데이터 확인
def get(self):
return self.pop(0) # 인덱스가 0인 데이터 pop
q = Queue()
q.put(1)
q.put(5)
q.put(10)
print("my queue is:", q) # [1, 5, 10]
print("removed value is:", q.get()) # 가장 먼저 들어간 애를 get!
print("my queue is:", q) # [5, 10]
print("peeked value is:", q.peek()) # 가장 나중에 들어간 애 확인만
print("my queue is:", q) # [5, 10]
2. 이미 구현된 클래스 import
from queue import Queue
q = Queue()
q.put(1)
q.put(5)
q.put(10)
print("my queue is:", q) # [1,5,10]
print("removed value is:", q.get()) #get 정의 하지 않아도 내장되어있어서 사용가능
print("my queue is:", q)
print("peeked value is:", q.peek()) #peek도 자동 내장