2023.04.21

Vinyl Stage·2023년 4월 21일
0

개발일지

목록 보기
37/42

금일 Error

JS와 HTML ID잡기


Uncaught TypeError: Cannot read properties of null (reading 'value')
별건 없고 늘 햇갈리는 부분인데 두 가지경우가 있다

  1. id을 안해줌
  2. script태그가 상단에 위치함

1번인 경우가 대부분일텐데 오랜만에 js를 다루다 보니 id와 name잡는것을 햇갈렸다.


보다시피 js에서는 getElementByIdemailpassword를 잡아주었지만 html에서 전혀 id를 설정해 주지 않았다

일부러 nameid둘다 안해주었다

햇갈려서 교차실험해본 결과 id로 무조건 설정해 주어야 한다
말 그대로 getElementBy"id"이기 때문이다


이렇게 해결해 주면 된다

그럼 아주 잘 실행된다

2번인 경우도 간혹있다

일전에 미니프로젝트와 다른 프로젝트를 하면서 느낀거지만 가장 하단인 </body>위에<script src="/app.js"></script>를 넣어주지 않으면 이친구가 연결시킨 해당 함수를 못읽는다

SyntaxError


Uncaught SyntaxError: await is only valid in async functions
이게 뭐라고 한참을 고민했다

친절하게 알려준 에러내용을 읽어보면 await는 반드시 async함수안에서만 유효하다는 뜻이다


꼭! 세트로 생각하고 잡아주자


잘 작동하는것을 볼 수있다


알고리즘

프로그래머스 행렬의 덧셈
https://school.programmers.co.kr/learn/courses/30/lessons/12950

내 코드
'''zip사용'''


def solution1(arr1, arr2):
    answer = [[x+y for x, y in zip(i, j)]for i, j in zip(arr1, arr2)]
    return answer


'''range(len())'''

def solutio2(arr1, arr2):
    for i in range(len(arr1)):
        for j in range(len(arr2[0])):
            arr1[i][j] += arr2[i][j]
    return arr1


'''list comprehension 변환'''

def solution3(arr1, arr2):
    answer = [[arr1[i][j] + arr2[i][j]
               for j in range(len(arr1[0]))] for i in range(len(arr1))]
    return answer


'''map사용'''

def sumMatrix(arr1, arr2):
    return [list(map(sum, zip(*x))) for x in zip(arr1, arr2)]
지현님 코드

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

이렇게 zip도 써보고 range(len())로만 해보고 이를 List Comprehension으로 바꿔보고 map을 사용한 사람의 코드도 뜯어보았다

zip()

zip이 아주 굉장했다

먼저 어떤건지 공식문서를 확인해보자

zip(*iterables, strict=False)

이게 무슨말이냐

Iterate over several iterables in parallel, producing tuples with an item from each one.
여러 이터러블. 즉, 반복가능한 항목을 병렬로 반복(parallel)하여 각 항목의 튜플을 생성한다는 뜻이다

중요한건 병렬

예를들어

arr1 = [[1, 2], [2, 3]]
arr2 = [[3, 4], [5, 6]]

for i in zip(arr1, arr2):
    print(i)

# 출력
([1, 2], [3, 4])
([2, 3], [5, 6])

이렇게 나온다는 것이다
zip을 사용하지 않으면

for i in arr1:
    for j in arr2:
        print(f'this is i{i}and this is j{j}')
        
# 출력
this is i[1, 2]and this is j[3, 4]
this is i[1, 2]and this is j[5, 6]
this is i[2, 3]and this is j[3, 4]
this is i[2, 3]and this is j[5, 6]

이런식이기 때문에 zip으로 꺼내쓰기 아주 편하다

그렇게 다 뒤집어 까주기 위해

for i, j in zip(arr1, arr2):
    print(i, j)
    print('='*20)
    for x, y in zip(i, j):
        print(x, y)
        
# 출력
[1, 2] [3, 4]
====================
1 3
2 4
[2, 3] [5, 6]
====================
2 5
3 6

이렇게 빼주고 그걸 각각 더해서 리스트 형태로 담는데 쉽게 하기 위해 리스트컴프리헨션으로 묶은 것이다

두번째는 가장 무난한 방법이기에 넘어가고 가장 신기했던 map()을 살펴보자

map()

map(function, iterable)
이는 반복가능한 객체의 각 요소에 적용하여 그 결과를 반환하는mapping작업을 수행한다

이처럼 map(sum, zip(*x))에서 *로 튜플껍데기를 벗기고 이를 zip()을 사용해

[(1, 3), (2, 4)]
[(2, 5), (3, 6)]

로 바꾼뒤 sum으로 각각 mapping해주고 이를 list()를 사용해 리스트 형태로 만든 뒤 []에 담아 한번 더 리스트에 담는다(2차원)

그리하여 답이

[[4, 6], [7, 9]]

이렇게 나온다

profile
Life is Art

0개의 댓글