본문 바로가기

STUDY/Algorithms

[JS] 교점에 별 만들기

프로그래머스 교점에 별 만들기

  • 난이도 2

문제 접근

1. 교점을 찾는다.

- 교점을 찾는 방법은 문제에 나와 있다.

const x=(b*f-e*d)/(a*d-b*c);
const y=(e*c-a*f)/(a*d-b*c);

x, y 가 정수인 경우에만 판단을 해주면 되는데, Number.isInteger() 을 이용하면 정수인지 아닌지 확인이 가능하다.

 

2. 최소의 영역을 찾아준다.

모든 별을 포함하는 최소한의 크기를 return 해주어야하기 때문에 그릴 수 있는 영역을 최소한으로 잡아준다.

(4, 1), (4, -4), (-4, -4), (-4, 1), (0, 4)

만약에 정수로 된 교점이 위와 같다고 예제를 들어본다.

그렇게 되면 x 최소=-4 , x최대=4, y 최소=-4, y 최대=4 이렇게 되고, 그 외의 영역은 필요없다.

최소(-4)가 0이라고 생각하면, 최소 ~ 최대 길이는 다음과 같이 설정해줄 수 있다.

최소의 영역을 채워주고 . 으로 채워준다.

  const nx = maxX - minX;
  const ny = maxY - minY;

  const arr = Array.from(Array(ny + 1), () => Array(nx + 1).fill("."));

3. 음수 판단

음수들을 배열에 어떻게 그릴지가 중요하다.

위에서도 설명했듯이, 최소 값(음수 or 양수)을 0으로 잡아주는 것이다.

 

만약 최소 값 x= -4, 현재 값이 0이라면 2차원 배열 상에서 현재는 현재(0)-최소값(-4) 를 해주면 된다.

 

현재 값이 음수 / 양수인지 중요하다.

 

현재 값이 음수인 경우,  target + Math.abs(최소값) 
현재 값이 양수인 경우, target - 최소 값

 

4. 뒤집어주기

 

배열을 뒤집어 주고, join 함수를 통해 합쳐주면 끝이다 ! ✨ 

코드

function solution(line) {
  var answer = [];
  let len = line.length;
  const pos = new Set();
  let [minX, minY] = Array(2).fill(Infinity);
  let [maxX, maxY] = Array(2).fill(-Infinity);

  for (let i = 0; i < len - 1; i++) {
    const [a, b, e] = line[i];
    for (let j = i + 1; j < len; j++) {
      const [c, d, f] = line[j];

      if (a * d - b * c === 0) continue;

      const x = (b * f - e * d) / (a * d - b * c);
      const y = (e * c - a * f) / (a * d - b * c);

      if (!Number.isInteger(x) || !Number.isInteger(y)) continue;

      pos.add([x, y]);

      // 최대 최소 영역 구하기
      minX = Math.min(x, minX);
      minY = Math.min(y, minY);
      maxX = Math.max(x, maxX);
      maxY = Math.max(y, maxY);
    }
  }
  const nx = maxX - minX;
  const ny = maxY - minY;

  const arr = Array.from(Array(ny + 1), () => Array(nx + 1).fill("."));

  for (let [x, y] of pos) {
    const nx = x > 0 ? x - minX : x + Math.abs(minX);
    const ny = y > 0 ? y - minY : y + Math.abs(minY);
    arr[ny][nx] = "*";
  }

  for (let i = arr.length - 1; i >= 0; i--) {
    answer.push(arr[i].join(""));
  }

  return answer;
}

'STUDY > Algorithms' 카테고리의 다른 글

[JS] 징검다리 건너기  (0) 2023.04.25
[JS] 순위 검색  (0) 2023.04.20
JS로 알고리즘하기  (0) 2023.03.03
[JS | 알고리즘] BFS 와 0-1 BFS  (0) 2023.02.05