본문 바로가기
일반 학습/코딩 테스트

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

by StelthPark 2022. 3. 29.

처리조건

풀이

아래 참고사항을 보면 이처럼 교점이 존재하는 경우와 두직선이 평행하거나 일치하는 조건을 알려준다.

line으로 받은 배열은 A B E와 C D F를 각각 조합할 수 있다.for문을 돌려 첫 인덱스와 이중for문으로 첫인덱스+1한 값 부터 차례로 끝가지 검사하고  검사할 때마다 기준 인덱스와 비교할 인덱스에서 각각 a, b, e를 그리고 c, d, f를 추출하여

평행하는지 아닌지 값을 slope라는 변수에 담아주었다. 그리고 x와 y값을 slope를 이용해 찾아주고 slope가 0이 아닌 경우 x와y를 정수인지 확인해 둘다 정수 인경우에만 최대x,y 최소 x,y를 계속해서 바꾸어준다. 그리고 정수인 모든 좌표들은 allXY라는 배열에 푸시해준다.

 

입력값 line이 [[2, -1, 4], [-2, -1, 4], [0, -1, 1], [5, -8, -12], [5, 8, 12]]

이라면, 아래처럼 이중 for문이 돌아간다.

현재 조건에 맞는 정수 좌표값과 최대 최소 x,y 값을 확인해보면

여기서 실제 x,y좌표 [-0,4]를 생각해보자 x가 올라가서 [1,4]가 왼다면 x값이 올라간것이다. 하지만 우리의 배열에서는 x가 움직이면 좌표에서 y처럼 위아래로 움직인다. 그렇기 때문에 여기서 x는 실제 우리 배열에서 y가 되고 y는 x가 된다고 생각해봐야한다. x와y의 최대 최소값을 이용해 원판을 구해 모든 요소에 "."을 채우며 해당하는 좌표값에만 *를 바꿔주면된다.

function solution(line) {
  let allXY = [];
  let maxX = -Number.MAX_SAFE_INTEGER; //최대값으로 들어올 값중 가장 작은값
  let maxY = -Number.MAX_SAFE_INTEGER;
  let minX = Number.MAX_SAFE_INTEGER; //최소값으로 들어올 가장 큰 값
  let minY = Number.MAX_SAFE_INTEGER;
  let returnStar = [];
  for (let i = 0; i < line.length - 1; i++) {
    for (let j = i + 1; j < line.length; j++) {
      const [a, b, e] = line[i];
      const [c, d, f] = line[j];

      let slope = a * d - b * c;
      if (slope) {
        let x = (b * f - e * d) / slope;
        let y = (e * c - a * f) / slope;
        if (Number.isInteger(x) && Number.isInteger(y)) {
          maxX = Math.max(maxX, x);
          maxY = Math.max(maxY, y);
          minX = Math.min(minX, x);
          minY = Math.min(minY, y);
          allXY.push([x, y]);
        }
      }
    }
  }

  const answer = new Array(Math.abs(maxY - minY) + 1).fill().map((_, index) => {
    return new Array(Math.abs(maxX - minX) + 1).fill(".");
  });

  for (let i = 0; i < allXY.length; i++) {
    const [starX, starY] = allXY[i];

    answer[maxY - starY][starX - minX] = "*";
  }
  for (let i = 0; i < answer.length; i++) {
    returnStar.push(answer[i].join(""));
  }
  return returnStar;
}

 

댓글