본문 바로가기
JAVASCRIPT/코딩테스트

프로그래머스 코딩테스트 레벨 1 - 행렬의 덧셈 풀이 해석 및 답안 [자바스크립트]

by 진짠 2023. 3. 29.
728x90

https://school.programmers.co.kr/learn/courses/30/lessons/12950

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

문제

행과 열이 같은 두 행렬의 같은 행, 같은 열의 값을 서로 더한 값을 구하는 문제. 

행렬에 대한 기본적인 이해가 필요하다. 고등학교 수학 맨 첫 단원에서 배우는 것으로 기억하는데(내 기억이 맞다면) 지금 와서 떠올리려고 하니까 기억이 가물가물하다.

 

간단하게 짚어보면 행렬은 수를 행(Row)과 열(Column)에 맞춰서 직사각형의 모양으로 순서있게 배열하여 괄호([])로 묶은 것이다.

코딩 테스트에서는 이 행렬을 2차원 배열로 행과 열을 각각 표현한다.

 

예를 들면,

[[1,2],

[3,4]]

이런 모양의 행렬 arr1이 주어질 때 2차원 배열 arr1[i][j] 의 형태로 행렬의 각 값에 접근할 수 있다.

 

제한조건

주어진 두 행렬의 행과 열의 길이는 500을 넘지 않는다.

 

성능 면에서 신경써서 코딩을 한 부분은 없었다.

왜냐하면 단순 이중 for문을 사용해서 문제를 해결했음에도 통과할 수 있었기 때문이다.

 

function solution(arr1, arr2) {
    var answer = []; //행들의 합을 모아놓을 배열 변수
    for(let i=0;i<arr1.length;i++) {
        let sum = []; //각 행들에 속한 열의 합을 모아놓을 배열 변수
        for(let j=0;j<arr1[i].length;j++) {
            sum.push(arr1[i][j] + arr2[i][j]); //열 순서대로 원소들을 합한 뒤 push해준다.
        }
        answer.push(sum); //합한 원소들을 행 순서대로 push해준다.
    }
    return answer;
}

처음 문제를 접했을 땐 행렬에 대한 개념이 가물가물해서인지 굉장히 헷갈렸던 기억이 있다.

먼저 행의 길이만큼 for문을 돌린 뒤 각 행에 속한 열들의 합을 저장할 변수 sum을 선언한다. 그리고 각 행의 열의 길이(arr1.length)만큼 for문을 돌려서 sum에 열의 합들을 저장해준다. 

마지막으로 sum을 행 순서대로 answer에 push해주면 된다.

 

필자와 같이 코테 초보자임에도 불구하고 위 문제를 쉽게 풀었다면 이과이거나 고등학교 수학 과목을 열심히 참여하였다는 뜻이니 자기 자신을 칭찬해주자.(?)

 

다른 사람의 풀이

이중 for문 대신 map() 함수를 두번 사용해서 풀 수도 있다는 사실을 알았다.

 

A.map((arr1, idx1) => arr1.map((val, idx2) => val+B[idx1][idx2]));
//A와 B는 두 행렬을 뜻함

대충 이런 식인데, 행을 기준으로한 map()함수로 각 행의 열들의 배열인 arr1과 인덱스 i를 구하고 배열 arr1을 다시 map()함수를 사용하여 각 열들의 값 val과 인덱스 j를 구한다. 각 열들의 합은 val(첫번째 배열 원소들의 값)과 인덱스 i와 j를 사용하여 두번째 배열 원소들의 값을 알아낸 뒤 합하면 된다.

 

map()함수에 대한 이해도가 있다면 for문의 대안으로 사용할 수 있지 않았을까.

 

 

728x90

댓글