이차원 정수 배열 arr이 매개변수로 주어집니다. arr의 행의 수가 더 많다면 열의 수가 행의 수와 같아지도록 각 행의 끝에 0을 추가하고, 열의 수가 더 많다면 행의 수가 열의 수와 같아지도록 각 열의 끝에 0을 추가한 이차원 배열을 return 하는 solution 함수를 작성해 주세요.
제한사항
입출력 예
arr | result |
---|---|
[[572, 22, 37], [287, 726, 384], [85, 137, 292], [487, 13, 876]] | [[572, 22, 37, 0], [287, 726, 384, 0], [85, 137, 292, 0], [487, 13, 876, 0]] |
[[57, 192, 534, 2], [9, 345, 192, 999]] | [[57, 192, 534, 2], [9, 345, 192, 999], [0, 0, 0, 0], [0, 0, 0, 0]] |
[[1, 2], [3, 4]] [[1, 2], [3, 4]] |
입출력 예 설명
입출력 예 #1
입출력 예 #2
입출력 예 #3
function solution(arr) {
if (arr.length == arr[0].length) return arr;
else if (arr.length > arr[0].length) {
arr.map((v, i) => {
while (arr[i].length < arr.length) {
arr[i].push(0);
}
});
return arr;
} else {
arr.map((v, i) => {
while (arr[i].length > arr.length) {
arr.push(Array(arr[i].length).fill(0));
}
});
return arr;
}
}
처음 풀이에는 while 루프가 없었다. 왜냐면... 그게 없어도 테스트 케이스는 통과됐거든 ^^ 정답률 25퍼센트의 처참한 확률로 실패해버렸고 왜일까... 고통받던 중 반례를 알게 되었다.
낙방 여우님 감사해요 ㅠㅠ
그래서 콘솔에 하나씩 찍어가면서 문제의 원인을 파악해봤다.
while 루프가 돌아가지 않는다면 각 행에 단 하나의 0만 추가가 된다. 각 열을 행의 길이와 동일하게 만들기 위해서는 여러 개의 0이 추가되어야 할 수 있다. 때문에 while 루프를 사용하여 arr[i].length < arr.length
조건을 만족하지 않을 때까지, 전체 행의 길이가 첫 번째 열의 길이와 같아질 때까지 새로운 행(0)을 추가하게 해주었다.
arr.push(Array(arr[i].length).fill(0));
이 코드 역시 단 한 번만 실행되고, 새 행을 하나만 추가한다. 하지만 현재 상황에서는 i를 돌며 i의 길이만큼의 배열을 추가해줘서 [0, 0, 0]의 원소가 두 번 추가되어 버렸다. 이런 예외 상황을 처리하기 위해서 while 루프를 사용해 arr.length < arr[0].length
조건을 만족하지 않을 때까지, 전체 행의 길이가 첫 번째 행의 길이와 같아질 때까지 새로운 행을 추가하는 것으로 고쳐주었다.
function solution(arr) {
let n = Math.max(arr.length, Math.max(...arr.map(v=>v.length)));
for (let a of arr) while (a.length<n) a.push(0);
while (arr.length < n) arr.push(Array(n).fill(0));
return arr;
}
최대 길이 n을 계산한다. arr.length
(2차원 배열 바깥쪽 배열의 길이)와 Math.max(...arr.map(v=>v.length))
(배열 내 각 행, 즉 내부 배열의 최대 길이)를 비교하여 더 큰 값을 n에 할당한다.. (map 함수를 이용하여 각 행의 길이를 배열로 만들어서 계산. 그런데 어차피 각 행의 길이는 전부 같다고 제한 사항에 있었으니까 여기서는 불필요한 계산이 아닌가 싶긴 함. 하지만 배워가용~)
첫 번째 for문과 while 루프를 통해서 각 행의 길이가 n이 될 때까지 0을 추가한다. 모든 행이 같은 길이를 갖도록 한다.
두 번째 while 루프는 배열의 행의 길이가 n이 될 때까지 수행된다. 길이가 n인 새로운 행 (Array(n).fill(0))을 배열에 추가한다. 모든 열이 같은 길이가 되도록 한다.
arr 반환!
function solution(arr) {
const ROWS = arr.length;
const COLS = arr[0].length;
const DIFF = Math.abs(ROWS - COLS);
if(ROWS > COLS) {
for(let i=0; i<ROWS; i++) {
for(let j=0; j<DIFF; j++) {
arr[i].push(0);
}
}
} else if(ROWS < COLS) {
for(let i=0; i<DIFF; i++) {
const row = new Array(COLS).fill(0);
arr.push(row);
}
}
return arr;
}
행과 열을 ROWS
, COLS
변수에 할당한다.
DIFF
는 행과 열 길이 차이의 절대값을 구하여 할당한다.
행이 열보다 길 경우 각 행에 DIFF 만큼의 0을 추가하여 열의 길이를 행에 맞춘다.
열이 행보다 긴 경우 DIFF만큼 새로운 행을 추가하고, 각 새로운 행은 COLS의 길이만큼 0으로 채워진 배열이다. 이렇게 행의 길이를 열의 길이에 맞춘다.