💡 오늘의 학습 키워드
- 나누어 떨어지는 숫자 배열
- 행렬의 곱셈
나누어 떨어지는 숫자 배열
문제 링크 : https://school.programmers.co.kr/learn/courses/30/lessons/12910
문제 설명
array의 각 element 중 divisor로 나누어 떨어지는 값을 오름차순으로 정렬한 배열을 반환하는 함수,
solution을 작성해주세요.
divisor로 나누어 떨어지는 element가 하나도 없다면 배열에 -1을 담아 반환하세요.
제한 사항
1. arr은 자연수를 담은 배열입니다.
2. 정수 i, j에 대해 i ≠ j 이면 arr[i] ≠ arr[j] 입니다.
3. divisor는 자연수입니다.array는 길이 1 이상인 배열입니다.
문제 회고
💡 어떤 문제가 있었고, 나는 어떤 시도를 했는지 그리고 새롭게 안 사실은 무엇인지
제가 생각한 문제 해결 방법은 크게 다음과 같습니다.
- arr 원소 중 divisor로 나누어지는 것을 answer 리스트에 삽입합니다.
- 리스트 길이가 0이라면 나누어 떨어진 값이 없는 것이므로 -1을 반환합니다.
- sort 함수를 통해 오름차순 정렬을 한 후 결과 값을 리턴합니다.
리스트 삽입과 정렬 함수만 활용한다면 간단하게 풀 수 있는 문제였습니다.
💡 내가 해결한 방식은?
def solution(arr, divisor):
answer = []
# arr 원소들 중 divisor로 나누어 떨어지는 것을 answer에 추가
for i in arr:
if i % divisor == 0:
answer.append(i)
# 나누어 떨어지는 값이 없으면 -1
if len(answer) == 0:
answer.append(-1)
# 최종 answer를 오름차순으로 정렬
answer.sort()
return answer
행렬의 곱셈
문제 링크 : https://school.programmers.co.kr/learn/courses/30/lessons/12949
문제 설명
2차원 행렬 arr1과 arr2를 입력받아, arr1에 arr2를 곱한 결과를 반환하는 함수, solution을 완성해주세요.
제한 사항
1. 행렬 arr1, arr2의 행과 열의 길이는 2 이상 100 이하입니다.
2. 행렬 arr1, arr2의 원소는 -10 이상 20 이하인 자연수입니다.
3. 곱할 수 있는 배열만 주어집니다.
문제 회고
💡 어떤 문제가 있었고, 나는 어떤 시도를 했는지 그리고 새롭게 안 사실은 무엇인지
행렬의 곱을 구하는 문제라는 것만 알면 로직은 생각보다 간단했습니다.
- arr1 의 열과 arr2의 행이 같은지 확인하여 곱셈 가능 여부를 확인합니다.
- 이중 반복문으로 arr1 행, arr2 열을 순회합니다.
- arr1 행 길이의 인덱스를 순회하며 해당 인덱스의 arr1 행 값과 arr2 열 값을 곱하여 모두 더해줍니다.
초기 코드에서 문제 없이 로직 구현을 했다 생각했지만 다음 에러에 봉착했습니다.
TypeError: 'list' object cannot be interpreted as an integer
다시 코드를 확인해보니 answer 변수 초기화 단계에서
answer = [[ ]]
로 두고 아래 반복문에서 answer[i][j]를 호출한 것이 문제였습니다.
이렇게 초기화 하게 되면 answer가 1개의 빈 리스트를 가진 1차원 리스트가 된다는 점을 간과했습니다.
이를 해결하기 위해서 answer 리스트를 2차원 리스트로 초기화해주었습니다.
arr1 길이 x arr2 열 길이를 맞추어 초기화 해주니 더 이상 에러가 발생하지 않았습니다.
💡 내가 해결한 방식은?
def solution(arr1, arr2):
# answer 초기화
answer = [[0] * len(arr2[0]) for _ in range(len(arr1))]
if len(arr1[0]) == len(arr2):
# arr1 행 순회
for i in range(len(arr1)):
# arr2 열 순회
for j in range(len(arr2[0])):
# arr1 행과 arr2 열 곱을 answer에 저장
answer[i][j] = sum(arr1[i][ret] * arr2[ret][j] for ret in range(len(arr1[0])))
return answer
TIL
파이썬에서도 역시나 변수 초기화, 값을 입력 받는 방식, 다중 리스트 활용을 지속적으로 학습하고 체득하여
기본기를 탄탄하게 해두어야 한다고 느꼈다.
또 다른 스터티 멤버들의 코드를 보니 쉬운 문제일 수록 간결하게 해결한 코드들이 눈에 보였다.
쉬운 문제일 수록 빠르게 해결하고 내 코드보다 간결하게 해결한 다른 코드들을 보고 보다 효율적인
문제 해결 방법을 체득하려고 노력해야겠다.