[연습문제] 지난 시험 복습 문제 2




지난 시험 복습 문제 2 (211018)

네카라쿠배 온라인 1기를 수강하며 코딩테스트 시험 봤던 문제들을 다시 풀어보자.

게임판

function solution(h, w) {
  const dx = [0, 1]; //오른쪽, 아래
  const dy = [1, 0];

  let cnt = 0;

  const dfs = (x, y) => {
      console.log(x,y)
    if (x == h-1 && y == w-1) {
      ++cnt;
      return;
    }
    for (let i = 0; i < 2; i++) {
      let nx = x + dx[i];
      let ny = y + dy[i];
      if (nx < h && ny < w) {
        dfs(nx, ny);
      }
    }
  };

  dfs(0, 0);
  return cnt;
}

console.log(solution(3,3));



많이 들어온 숫자 순서대로 정렬

function solution(s) {
  const hash = [...s].reduce((acc, cur) => {
    acc[cur] = (acc[cur] || 0) + 1;
    return acc;
  }, {});

  const exist = Object.entries(hash)
    .sort((x, y) => (x[1] > y[1] ? -1 : x[1] < y[1] ? 1 : 0))
    .map(v => +v[0]);

  return [...exist, ...Array.from(Array(10), (_, i) => i).filter(v => !exist.includes(v))].join(' ');
}

console.log(solution('221123')); // 2 1 3 0 4 5 6 7 8 9
console.log(solution('1235670089006427894100')); // 2 1 3 0 4 5 6 7 8 9



피라미드

function solution(arr) {
  for (let i = 1; i < arr.length; i++) {
    arr[i][0] += arr[i - 1][0];
    arr[i][i] += arr[i - 1][i - 1];
  }
  for (let i = 2; i < arr.length; i++) {
    for (let j = 1; j < arr[i].length - 1; j++) {
      arr[i][j] += Math.max(arr[i - 1][j - 1], arr[i - 1][j]);
    }
  }

  return Math.max(...arr[arr.length - 1]);
}

console.log(solution([[3], [5, 10], [4, 6, 8]]));