본문 바로가기
일반 학습/코딩 테스트

[프로그래머스] 땅따먹기

by StelthPark 2022. 5. 3.

처리조건

풀이

처음에는 land길이만큼 for문을 돌면서 현재 land[i]에서 가장 큰 값을 추출하고 해당값의 인덱스를 변수로 기억시키며 현재 기억된 인덱스가 새로 배열에서 찾은 가장 큰 값의 인덱스와 일치한다면 그 값을 제외한 나머지 값중 최대 값을 찾고 그값의 인덱스를 다시 변수로 기억시키며 해당값을 -1로 바꿔서 다시 최대값을 검색해 answer에 점수를 쌓아주며 만약 일치하지 않는다면 맨 처음 찾은 최대값을 answer에 쌓고 인덱스를 변수로 기억시키는 방법으로 구성했다.

 

이렇게 하면 indexOf 특성상 최대값의 인덱스가 맨 앞만 찾게 되므로 

이러한 배열에서 정답은 4-2-6(3번째)-8로 가서 20이나와야하지만 indexOf가 맨 처음 나오는 요소의 인덱스를 반환하므로 4-2-6(1번째)-7로 가서 19가 나오게된다.

function solution(land) {
  let standIdx = -1;
  let answer = 0;
  for (let i = 0; i < land.length; i++) {
    let maxValue = Math.max(...land[i]);
    let maxValueIdx = land[i].indexOf(maxValue);
    if (standIdx === maxValueIdx) {
      land[i].splice(maxValueIdx, 1, -1);
      console.log(land[i]);
      let newMaxValue = Math.max(...land[i]);
      standIdx = land[i].indexOf(newMaxValue);
      answer += newMaxValue;
    } else {
      answer += maxValue;
      standIdx = maxValueIdx;
    }
  }
  return answer;
}

 

그래서 코드를 수정했다. 맨 첫번째 배열은 사실이전 인덱스의 영향을 받지 않으니 2번째 배열부터 검사하기로 했고 조건상 자신바로 위에 있는 점수는 제외하고 최대 값을 찾아 자신에 합쳐주면 되는 방식으로 그리고 for문을 다돌고나면 마지막 배열에 현재 계산 값이 쌓이니 이 값중 최대 값을 리턴해주기로 했다.

이렇게 2번째 배열에서 2,2,2,1에서 2는 위 4말고 3,2,1중에 최대값을 찾고 그당므 2는 3빼고 4,2,1중에 최대값을 찾아 자신에 더해주는 방식으로 찾았다. 자신의 값을 바꾸며 자신만이 더할 수 있는 최대값을 계속 저장해 나가는 것이다.!

  for (let rowIndex = 1; rowIndex < land.length; rowIndex++) {
    for (let colIndex = 0; colIndex < land[0].length; colIndex++) {
      console.log(Math.max(...land[rowIndex - 1].slice(0, colIndex), ...land[rowIndex - 1].slice(colIndex + 1)));
    }
    console.log(land);
  }

 

rowIndex-1 를 통해 자신 바로 위 배열에서 검색하게 되며 slice로 제어해 자신과 같은 인덱스는 빼고 그중에서 max값을 찾는다.

function solution(land) {
  for (let rowIndex = 1; rowIndex < land.length; rowIndex++) {
    for (let colIndex = 0; colIndex < land[0].length; colIndex++) {
      land[rowIndex][colIndex] += Math.max(...land[rowIndex - 1].slice(0, colIndex), ...land[rowIndex - 1].slice(colIndex + 1));
    }
  }
  return Math.max(...land[land.length - 1]);
}

 

댓글