Ax + By + C = 0으로 표현할 수 있는 n개의 직선이 주어질 때, 이 직선의 교점 중 정수 좌표에 별을 그리려 합니다.
예를 들어, 다음과 같은 직선 5개를
좌표 평면 위에 그리면 아래 그림과 같습니다.
이때, 모든 교점의 좌표는 (4, 1), (4, -4), (-4, -4), (-4, 1), (0, 4), (1.5, 1.0), (2.1, -0.19), (0, -1.5), (-2.1, -0.19), (-1.5, 1.0)입니다. 이 중 정수로만 표현되는 좌표는 (4, 1), (4, -4), (-4, -4), (-4, 1), (0, 4)입니다.
만약 정수로 표현되는 교점에 별을 그리면 다음과 같습니다.
위의 그림을 문자열로 나타낼 때, 별이 그려진 부분은 *, 빈 공간(격자선이 교차하는 지점)은 .으로 표현하면 다음과 같습니다.
이때 격자판은 무한히 넓으니 모든 별을 포함하는 최소한의 크기만 나타내면 됩니다.
따라서 정답은
입니다.
직선 A, B, C에 대한 정보가 담긴 배열 line이 매개변수로 주어집니다. 이때 모든 별을 포함하는 최소 사각형을 return 하도록 solution 함수를 완성해주세요.
별이 한 개 이상 그려지는 입력만 주어집니다.
function solution(line) {
// 두 직선의 교점 낳을 배열
const points = [];
for (let i = 0; i < line.length; i++) {
for (let j = i + 1; j < line.length; j++) {
const [a, b, e] = line[i];
const [c, d, f] = line[j];
const adbc = a * d - b * c;
// 나머지가 0이 아닌경우는 소수이기때문에 조건설정
if (
((b * f - e * d) / adbc) % 1 === 0 &&
((e * c - a * f) / adbc) % 1 === 0
) {
// 좌표를 points에 넣어줌
points.push([(b * f - e * d) / adbc, (e * c - a * f) / adbc]);
}
}
}
// 평면을 그려줌
// 최소 최댓값 설정해주고
let minX = Infinity;
let minY = Infinity;
let maxY = -Infinity;
let maxX = -Infinity;
for (let [x, y] of points) {
minX = Math.min(minX, x);
maxX = Math.max(maxX, x);
minY = Math.min(minY, y);
maxY = Math.max(maxY, y);
}
// 좌표 x,y값 구하기
const width = maxX - minX + 1;
const height = maxY - minY + 1;
const star = Array.from(Array(height), () => Array(width).fill("."));
// 배열은 0부터 시작하니깐 maxY, minX를 사용해서 좌표값 배열에 맞게 계산
for (let [x, y] of points) {
star[maxY - y][x - minX] = "*";
}
return star.map((a) => a.join(""));
}