저장을 습관화

프로그래머스 LV.0 이차원 배열 대각선 순회하기 본문

코딩 테스트/프로그래머스 - 자바스크립트

프로그래머스 LV.0 이차원 배열 대각선 순회하기

ctrs 2023. 9. 22. 13:08

프로그래머스 LV.0 이차원 배열 대각선 순회하기

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

 

프로그래머스

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

programmers.co.kr

 

1. 문제 명

이차원 배열 대각선 순회하기


2. 문제 설명

2차원 정수 배열 board와 정수 k가 주어집니다.

 

i + j <= k를 만족하는 모든 (i, j)에 대한 board[i][j]의 합을 return 하는 solution 함수를 완성해 주세요.


3. 제한 사항

- 1 ≤ board의 길이 ≤ 100

- 1 ≤ board[i]의 길이 ≤ 100

- 1 ≤ board[i][j] ≤ 10,000

- 모든 board[i]의 길이는 같습니다.

- 0 ≤ k < board의 길이 + board[i]의 길이


4. 예시

board k result
[[0, 1, 2],[1, 2, 3],[2, 3, 4],[3, 4, 5]] 2 8


5. 기본 제공 코드

function solution(board, k) {
    var answer = 0;
    return answer;
}


6. 제출한 내 답

const solution = (board, k) => {
  let answer = 0;
  board.forEach((v, i) => {
    v.forEach((v, j) => {
      i + j <= k ? (answer += v) : "";
    });
  });
  return answer;
};

 

6-2. VSC에 작성한 내용

const solution = (board, k) => {
  // board[i][j]과 같을때 i+j <= k를 만족하는 요소들의 합
  // 입출력 예시의 경우 아래와 같다.
  //   return (
  //     board[0][0] + // 0
  //     board[0][1] + // 1
  //     board[0][2] + // 2
  //     board[1][0] + // 1
  //     board[1][1] + // 2
  //     board[2][0] // 2
  //   ); // 실행 결과: 8
  let answer = 0;
  board.forEach((v, i) => {
    v.forEach((v, j) => {
      //   console.log(`i: ${i}, j: ${j}, 내부 forEach 요소: ${v}`);
      i + j <= k ? (answer += v) : "";
    });
  });

  return answer;
};

// 테스트
console.log(
  solution(
    [
      [0, 1, 2],
      [1, 2, 3],
      [2, 3, 4],
      [3, 4, 5],
    ],
    2
  )
);


7. 특이사항

런타임 에러가 발생한 코드

const solution = (board, k) => {
  let answer = 0;
  for (i = 0; i <= k; i++) {
    for (j = 0; j + i <= k; j++) {
      answer += board[i][j];
    }
  }
  return answer;
};

반복문을 실행하는 조건이 j + i <= k로는 부족했나 보다.


8. 다른 사람이 작성한 답

8-1. 가장 많이 쓰인 풀이 방법

function solution(board, k) {
  let answer = 0;
  for (let x = 0; x < board.length; x++) {
    for (let y = 0; y < board[0].length; y++) {
      if (x + y <= k) answer += board[x][y];
    }
  }
  return answer;
}

i+j<=k로 확인할 요소를 제한하는 방법이 런타임 에러가 나오는데

모든 요소를 전부 확인하는 방법이 통과했다고?

 

이 부분 더 알아봐야겠다

 

[추가]

원인을 찾았다

만약 입력값이 [[0, 1, 2], [1, 2, 3], [2, 3, 4], [3, 4, 5]], 9와 같을 경우

가져올 수 있는 최대 요소는 board[3][2]가 되지만

 

const solution = (board, k) => {
  let answer = 0;
  for (i = 0; i <= k; i++) {
    for (j = 0; j + i <= k; j++) {
      answer += board[i][j];
    }
  }
  return answer;
};

for 반복문은 board[3][3], board[3][4], board[3][5].... board[9][0] 까지의 요소를 요구한다.

즉 런타임 에러는 코드의 실행시간이 오래걸려서 발생한 것이 아닌

undefined 에러로 인해 발생한 것이었다.

 

너무 조건 i+j<=k에만 집착해서 생긴 에러였다.