[프로그래머스-기초] 특별한 이차원 배열 1

JE·2023년 12월 28일
0

코테/코플릿

목록 보기
44/57

특별한 이차원 배열 1

문제 설명

정수 n이 매개변수로 주어질 때, 다음과 같은 n × n 크기의 이차원 배열 arr를 return 하는 solution 함수를 작성해 주세요.

arr[i][j] (0 ≤ i, j < n)의 값은 i = j라면 1, 아니라면 0입니다.

제한사항

1 ≤ n ≤ 100

입출력 예

nresult
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 \ j012
0100
1010
2001

따라서 [[1, 0, 0], [0, 1, 0], [0, 0, 1]]을 return 합니다.

입출력 예 #2
예제 2번의 n의 값은 6으로 다음과 같이 2차원 배열을 채울 수 있습니다.

i \ j012345
0100000
1010000
2001000
3000100
4000010
5000001

따라서 [[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 \ j0
01

따라서 [[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


✏️ 마치며

요즘 코테 기초 문제를 풀면서 여러 메소드를 알고 어떤 식으로 활용해야하는지가
정말 중요하다는 점을 깨닳게 된다.

profile
[프론트 애송이] 작은 깨달음도 기록하기

0개의 댓글