[알고리즘 코드카타] 바탕화면 정리

2024. 11. 9. 00:39[Node.js_6기 본캠프 TIL]

https://school.programmers.co.kr/learn/courses/30/lessons/161990

 

 

예시를 보고 더 혼란스러웠던 문제이다. (x, y) 순서대로 result가 나와야 할 것 같은데 (y, x) 순서대로 result가 나와야 해서 괜히 더 헷갈렸던 것 같다. 

 

이중for문으로 좌표를 구하고, x의 최대/최소값과 y의 최대/최소값만 구한 뒤 순서대로 넣으면 될 것 같아서 코드를 짜기 시작했다.

function solution(wallpaper) {
  let point = [];

  for (let i = 0; i < wallpaper.length; i++) {
    for (let j = 0; j < wallpaper[i].length; j++) {
      if (wallpaper[i][j] === "#") {
        point.push([i, j])
      }
    }
  }

  return ...?
}

 

문득, 굳이 (x, y) 형태로 하나의 배열에 좌표값을 밀어넣을 필요가 있나? result를 뽑아내려면 너무 복잡해지지 않나? 라는 생각이 들어 x값과 y값을 따로 모아주는 형태로 바꾸기로 했다.

 

function solution(wallpaper) {
  let X = [];
  let Y = [];

  for (let i = 0; i < wallpaper.length; i++) {
    for (let j = 0; j < wallpaper[i].length; j++) {
      if (wallpaper[i][j] === "#") {
        Y.push(i);
        X.push(j);
      }
    }
  }

  X.sort((a, b) => a - b);
  Y.sort((a, b) => a - b);

  return [Y[0], X[0], Y[Y.length - 1], X[X.length - 1];
}

 

최소/최대값을 구해서 순서대로 구한 것 같은데, 전부 오답 처리가 되었다.

 

오답 결과를 보니, 최대값이 1씩 부족한 패턴이 보였다. 문제 예시를 한참 들여다보니, 최대값 좌표에서 1씩 더해주어야 파일을 모두 감쌀 수 있었다. 

 

최종 코드

function solution(wallpaper) {
  let X = [];
  let Y = [];

  for (let i = 0; i < wallpaper.length; i++) {
    for (let j = 0; j < wallpaper[i].length; j++) {
      if (wallpaper[i][j] === "#") {
        Y.push(i);
        X.push(j);
      }
    }
  }

  X.sort((a, b) => a - b);
  Y.sort((a, b) => a - b);

  return [Y[0], X[0], Y[Y.length - 1] + 1, X[X.length - 1] + 1];
}