[프로그래머스] 거리두기 확인하기 (JS)

hhkim·2023년 11월 6일
0

Algorithm - JavaScript

목록 보기
174/188
post-thumbnail

풀이 과정

  1. P의 위치 모두 찾기
  2. 2중 반복문 돌면서 P 좌표끼리 맨해튼 거리 비교
  3. 맨해튼 거리가 2보다 큰 경우 => 성공
    맨해튼 거리가 2보다 작은 경우 => 실패
  4. 맨해튼 거리가 2인 경우
  • 가로로 한 칸 띄어져 있는 경우 (r1, c1 + 1)X면 성공 아니면 실패
  • 세로로 한 칸 띄어져 있는 경우 (r1 + 1, c1)X면 성공 아니면 실패
  • 대각선으로 한 칸 띄어져 있는 경우 (r1, c2)(r2, c1)이 모두 X면 성공 아니면 실패
  1. 비교 중 하나라도 실패하면 해당 place 탐색 중단

코드

function solution(places) {
  const result = [];
  for (const place of places) {
    const ps = [];
    for (let i = 0; i < place.length; ++i) {
      for (let j = 0; j < place[0].length; ++j) {
        if (place[i][j] === 'P') ps.push([i, j]);
      }
    }

    let flag = true;
    for (let i = 0; i < ps.length - 1; ++i) {
      for (let j = i + 1; j < ps.length; ++j) {
        const [r1, c1] = ps[i];
        const [r2, c2] = ps[j];
        const d = Math.abs(r1 - r2) + Math.abs(c1 - c2);
        if (d > 2) continue;
        if (d < 2) {
          flag = false;
          break;
        }
        let partition = 1;
        if (r1 !== r2 && c1 !== c2) partition = 2;

        let cntX = 0;
        for (let y = Math.min(r1, r2); y <= Math.max(r1, r2); ++y) {
          for (let x = Math.min(c1, c2); x <= Math.max(c1, c2); ++x) {
            if (place[y][x] === 'X') ++cntX;
          }
        }
        if (partition !== cntX) flag = false;
      }
      if (!flag) break;
    }
    result.push(flag ? 1 : 0);
  }
  return result;
}

🤔

처음에 미로 찾기가 생각나서 DFS로 시도하다가 점점 복잡해져서 포기했다.
힌트를 보고 조건문으로 풀어보았다.
후 반복문 조건을 잘못 설정해서 디버깅하느라 거의 2시간이 걸렸다..

0개의 댓글