코딩 테스트/프로그래머스 level2

n^2 배열 자르기

fullfish 2022. 9. 11. 20:19

처음 코드

function solution(n, left, right) {
  let matrix = new Array(n).fill(0).map(() => new Array(n).fill(0));
  for (let i = 0; i < matrix.length; i++) {
    for (let j = 0; j < matrix.length; j++) {
      if (i >= j) matrix[i][j] = i + 1;
      else matrix[i][j] = j + 1;
    }
  }
  matrix = matrix.flat().slice(left, right + 1);
  return matrix;
}

문제에서 요구한대로 배열을 만들고 자르고 했는데

이러면 배열의 크기가 너무 커서 오류가 난다

 

조금 더 빠르게

function solution(n, left, right) {
  let arr = [];
  for (let i = 0; i < n ** n; i++) {
    let count = 1;
    for (let j = i + 1; j <= n; count > j ? j++ : (j = j)) {
      arr.push(j);
      count++;
      if (arr.length === right + 1) return arr.slice(left, right + 1);
    }
  }
}

2차원 배열을 애초에 안만들고

1차원 배열을 쭉 만들면서 right까지 갔을때 더 이상의 배열을 만들지 않고 리턴하게 했지만

이래도 아직 더 빠르게 해야했다

 

통과 코드

function solution(n, left, right) {
  let arr = [];
  let remainder = left % n;
  for (let i = parseInt(left / n); i < n ** n; i++) {
    let count = 1;
    for (let j = i + 1; j <= n; count > j ? j++ : (j = j)) {
      arr.push(j);
      count++;
      if (arr.length > right - left + remainder)
        return arr.slice(
          left - parseInt(left / n) * n,
          left - parseInt(left / n) * n + right - left + 1
        );
    }
  }
  console.log(arr);
}

배열의 시작점을 left가 속한 행의 처음으로 잡아서 했다

심지어  if (arr.length > right - left + remainder)를 처음에 remainder 대신 n을 더했는데

n이 얼마나 큰지 시간초과가나서 나머지를 더했다

 

다른 사람 코드

function solution(n, left, right) {
    var answer = [];

    for (let i = left; i <= right; i++) {
        answer.push(Math.max(i % n, parseInt(i / n)) + 1)
    }

    return answer;
}

 

'코딩 테스트 > 프로그래머스 level2' 카테고리의 다른 글

[1차] 뉴스 클러스터링  (0) 2022.09.12
기능개발  (0) 2022.09.12
위장  (0) 2022.09.11
튜플  (0) 2022.09.11
괄호 회전하기  (0) 2022.09.10