[프로그래머스] 쿼드압축 후 개수 세기 (재귀)

쿼카쿼카·2023년 3월 31일
0

알고리즘

목록 보기
48/67

코드

function solution(arr) {
  const count = [0, 0]
  
  function divide(row, col, n) {        
      const target = arr[col][row];
      const half = Math.floor(n/2);
      
      for(let i=col; i<col+n; i++) {
          for(let j=row; j<row+n; j++) {
              if(arr[i][j] !== target) {
                  divide(row, col, half);
                  divide(row+n/2, col+n/2, half);
                  divide(row+n/2, col, half);
                  divide(row, col+n/2, half);
                  
                  return;
              }
          }
      }
      count[target]++
  }
  
  divide(0, 0, arr.length)
  
  return count;
}

설명

  • 나는 5중 포문까지 갈 뻔한 거 정신줄 잡았는데 겁나 쉽게 푸네 이게 나라냐!!!!!!!!!
  • 저는 처음에 0과 1 개수를 미리 구했는데 거기서만 시간 엄청 잡아먹더라구요
  • 사각형 첫 index의 값을 target으로 잡아요
  • 이후 half를 이용해 계산해야하니 미리 선언해둬요!
  • 한 사각형의 행렬을 돌며 모두 같은 값인지 확인해요.
    • 만약 같지 않으면 재귀함수를 돌리는데 그 사각형 내부리그는 n을 반토막 내줘야겠죠?
    • 그리고 계속 돌면 안 되니, 한 번 돌고 return으로 함수를 탈출해줘요
  • col과 row의 순서를 바꾸면 안 돼요!
    • 행렬이라 그래서 항상 행 먼저 썼는데 컴퓨터에서는 col이 먼저에요
  • 모두 같은 값이면 count[target]을 하나 올려줘요!
profile
쿼카에요

0개의 댓글