Level2 - 교점에 별 만들기

손대중·2022년 7월 9일
0

문제 설명 및 링크

https://school.programmers.co.kr/learn/courses/30/lessons/87377?language=javascript

나의 풀이

각 라인들의 교차점들을 전부 구한 다음 결과값이 도출하는게 포인트, 두 라인의 교차점은 0 ~ 1 개이다. (평행하거나 그렇지 않거나)

뭐 문제 안에 참고사항으로 교차점 구하는 공식을 넣어놨더라. 걍 요거대로 코딩하면 됨.

개인적으로는 교차점 구하는게 핵심이라 생각하고, 공식을 알든 모르든 교차점 구하는 걸 고민하는게 * 을 그리는 것보다 더 교육적으로 좋을 것 같다고 생각함.

코드

모든 프로그래머스 문제 관련 코드들은 GitHub 링크 에 있음.

<script>
  function solution(line) {

      let stars = [];

      let minX = null;
      let minY = null;
      let maxX = null;
      let maxY = null;

      for (let i = 0; i < line.length - 1; i++) {
          const l1 = line[i];

          for (let j = i + 1; j < line.length; j++) {
              const l2 = line[j];

              const x = ((l1[1] * l2[2]) - (l1[2] * l2[1])) / ((l1[0] * l2[1]) - (l1[1] * l2[0]));
              const y = ((l1[2] * l2[0]) - (l1[0] * l2[2])) / ((l1[0] * l2[1]) - (l1[1] * l2[0]));

              if (Number.isInteger(x) && Number.isInteger(y)) {

                  if (minX === null || x < minX) {
                      minX = x;
                  }
                  if (maxX === null || x > maxX) {
                      maxX = x;
                  }
                  if (minY === null || y < minY) {
                      minY = y;
                  }
                  if (maxY === null || y > maxY) {
                      maxY = y;
                  }

                  stars.push({x, y});
              }
          }
      }

      maxX -= minX;
      maxY -= minY;
      stars = stars.map(star => {
          return {
              x: star.x - minX,
              y: Math.abs(maxY - (star.y - minY))
          };
      });

      let result = (new Array(maxY + 1)).fill([]);
      result = result.map(r => (new Array(maxX + 1)).fill('.'));

      stars.map(star => {
          result[star.y][star.x] = '*';
      });

      return result.map(r => {
          return r.join('');
      });
  }
</script>

0개의 댓글