Algorithm

프로그래머스 땅따먹기 공부

세모난 야구공 2022. 5. 5. 01:52

 

처음 푼 코드

문제점 : 모든 경우에 수를 다 파악함  -> 최적화 안됨

function solution(land) {
  let result = [];
  // bfs 사용
  function repeat(arrs, num, idx) {
    // 탈줄조건
    if (arrs.length === 0) {
      result.push(num);
      console.log('pushresult:', num);
      console.log();
      console.log();
      return;
    }

    let arr = arrs.shift();

    for (let i = 0; i < arr.length; i++) {
      // 전에 사용했었언 idx이면 넘어감
      if (idx === i) {
        continue;
      }
      console.log('arrs:', arrs);
      console.log('arr:', arr);
      console.log('i:', i);
      console.log('num+arr[i]:', num + arr[i]);
	  
      // 함수실행
      repeat(arrs.slice(), num + arr[i], i);
      console.log();
    }
  }

 

해당코드는 오류가 나옴

 

실패 (signal: aborted (core dumped))

 

수정후

function solution(land) {
  //열 인덱스만큼 반복
  for (let rowIndex = 1; rowIndex < land.length; rowIndex++) {
    // 행 인덱스 만큼 반복
    for (let colIndex = 0; colIndex < land[0].length; colIndex++) {
      // land의 각각의 위치에 기존값에 이전에 더할수 있는 숫자중 가장 최댓값 더하기
      console.log('rowIndex:', rowIndex);
      console.log('colIndex:', colIndex);
      console.log('더하는 최대 배열:', [
        ...land[rowIndex - 1].slice(0, colIndex),
        ...land[rowIndex - 1].slice(colIndex + 1),
      ]);
      land[rowIndex][colIndex] += Math.max(
        ...land[rowIndex - 1].slice(0, colIndex),
        ...land[rowIndex - 1].slice(colIndex + 1)
      );
      console.log('land[rowIndex][colIndex]:', land[rowIndex][colIndex]);
    }
  }
  console.log('최댓값 전의 배열확인:', land[land.length - 1]);
  return Math.max(...land[land.length - 1]);
}

 

 

배운점

저는 코드를 무조건 흐름에 따라서 진행을 확인하면 된다고 생각하였으나 코드의 복잡도가 너무 올라가서 고민을 많이 하였는데

흐름을 조금 바꾸는 것만으로도 효율성이 확 달라진다는 것을 알게 되었다.

 

 

관련 자료

github.com/ChooHongWook/test_argoritem2/