정수 n이 매개변수로 주어질 때, 다음과 같은 n × n 크기의 이차원 배열 arr를 return 하는 solution 함수를 작성해 주세요.
arr[i][j] (0 ≤ i, j < n)의 값은 i = j라면 1, 아니라면 0입니다.
1 ≤ n ≤ 100
n | result |
---|---|
3 | [[1, 0, 0], [0, 1, 0], [0, 0, 1]] |
6 | [[1, 0, 0, 0, 0, 0], [0, 1, 0, 0, 0, 0], [0, 0, 1, 0, 0, 0], [0, 0, 0, 1, 0, 0], [0, 0, 0, 0, 1, 0], [0, 0, 0, 0, 0, 1]] |
1 | [[1]] |
입출력 예 설명
입출력 예 #1
예제 1번의 n의 값은 3으로 다음과 같이 2차원 배열을 채울 수 있습니다.
i \ j 0 1 2 0 1 0 0 1 0 1 0 2 0 0 1 따라서 [[1, 0, 0], [0, 1, 0], [0, 0, 1]]을 return 합니다.
입출력 예 #2
예제 2번의 n의 값은 6으로 다음과 같이 2차원 배열을 채울 수 있습니다.
i \ j 0 1 2 3 4 5 0 1 0 0 0 0 0 1 0 1 0 0 0 0 2 0 0 1 0 0 0 3 0 0 0 1 0 0 4 0 0 0 0 1 0 5 0 0 0 0 0 1 따라서 [[1, 0, 0, 0, 0, 0], [0, 1, 0, 0, 0, 0], [0, 0, 1, 0, 0, 0], [0, 0, 0, 1, 0, 0], [0, 0, 0, 0, 1, 0], [0, 0, 0, 0, 0, 1]]을 return 합니다.
입출력 예 #3
예제 1번의 n의 값은 1이고 다음과 같이 2차원 배열을 채울 수 있습니다.
i \ j 0 0 1 따라서 [[1]]을 return 합니다.
function solution(n) {
let result = [];
for(let i = 0; i < n; i++){
result.push(new Array(n).fill(0))
}
for(let i = 0; i < result.length; i++){
result[i][i] = 1
}
return result;
}
이번 문제는 한 번 막히니 계속 막혔다.
그래서... 결국 다른 사람들 질문 내용을 확인하면서 문제를 풀었다.
내가 막혔던 부분은 이차원 배열을 만들어야하는 부분이였다.
new Array(n).fill(0)
를 통해 예를 들어 n이 3인 경우 [000]
으로 생성할 수 있었다.
그러나 [[0,0,0], [0,0,0], [0,0,0]]
이차원 배열을 만드는게 생각 보다 어려웠으나
new Array(n).fill(0)
의 길이 만큼 배열을 순회해 다시 배열을 만들어 주면 되는 아주 간단한 방법이 있었다...ㅎ
너무 깊게 생각하면 쉬운 방법을 떠오르기 힘들 것 같다.
let result = [];
for(let i = 0; i < n; i++){
result.push(new Array(n).fill(0))
}
n번 순회하고 result라는 빈 배열에 new Array(n).fill(0)
인 [0,0,0]
배열을 push해 이차원 배열을 먼저 만들어 준다.
for(let i = 0; i < result.length; i++){
result[i][i] = 1
}
result를 순회하면서 해당 index를 1로 변경해 주면되는 간단한 문제였다.
리팩토링보단 다른 방식으로도 문제를 풀어보았다.
function solution(n) {
let arr = new Array(n).fill(0).map(() => new Array(n).fill(0));
for(let i in arr){
arr[i][i] = 1
}
return arr
}
new Array(n).fill(0)
이라는 배열을 map으로 순환하고 동일한 길이 반큼 배열을 만들어 준다.
그리고 for...in
문으로 arr
를 순회한다.
이전 코드보다 간결하게 작성해 보았다.
function solution(n) {
const answer = Array.from(Array(n), () => Array(n).fill(0));
for (let i = 0; i < n; i++) {
answer[i][i] = 1;
}
return answer;
}
function solution(n) {
var answer = [[]];
answer = Array.from({length: n}, () => Array(n).fill(0))
for(let i = 0; i <n ; i++){
answer[i][i] = 1
}
return answer;
}
Array.from()
이라는 메소드를 사용하셨다.
Array.from()
- 순회 가능 또는 유사 배열 객체에서 얕게 복사된 새로운 Array 인스턴스를 생성합니다.
Array.from(arrayLike) Array.from(arrayLike, mapFn) Array.from(arrayLike, mapFn, thisArg)
-출처 : mnd
요즘 코테 기초 문제를 풀면서 여러 메소드를 알고 어떤 식으로 활용해야하는지가
정말 중요하다는 점을 깨닳게 된다.