100/100
1시간 소요
- 교점찾기
- 교점에 따르는 최소 결과 영역 찾기
- 중복되는 교점 처리하기
- 같은 값을 가진 배열값은 없다 => 있다면 교점이 수도 없으니 결과가 나올수없다
10/0 => Infinity
-10/0 => -Infinity
0/0 => NaN
Number.isInteger(Infinity) => false
Number.isInteger(-Infinity) => false
Number.isInteger(NaN) => false
function calculate(firstLine,secondLine){
const [A,B,E] = firstLine;
const [C,D,F] = secondLine;
let X = (B*F-E*D) / (A*D - B*C)
let Y = (E*C-A*F) / (A*D - B*C)
if(Number.isInteger(X) && Number.isInteger(Y))
return {X,Y}
return undefined
}
function solution(line) {
var answer = [];
let point = [];
let calculateResult
const line_length = line.length;
// 1. 정수 포인트 지점찾기
for(let i=0;i<line_length;i++){
for(let j=i+1;j<line_length;j++){
calculateResult =calculate(line[i],line[j])
// calculate return이 없을경우 undefined일 경우 해당 부분은 if문이 성공X
if(calculateResult)
point.push(JSON.stringify(calculateResult))
}
}
// 2. 중복 부분 처리 ex)4번 입출력
let set = Array.from(new Set(point))
set = set.map(val=>{
return JSON.parse(val)
})
//3. 만들 최소영역 찾기
let maxWidth=-Infinity,minWidth=Infinity,maxHeight=-Infinity,minHeight=Infinity
set.map(obj=>{
maxWidth = Math.max(maxWidth, obj.X)
minWidth = Math.min(minWidth, obj.X)
maxHeight = Math.max(maxHeight, obj.Y)
minHeight = Math.min(minHeight, obj.Y)
})
let str = ''
let findValue
//4. 영역에 따르는 결과 찾기
//y위에서부터 아래로 체크 시작
for(let y=maxHeight;y>=minHeight;y--){
str = ''
//x위에서부터 오른쪽으로 체크 시작
for(let x=minWidth;x<=maxWidth;x++){
//교점이 있다면 존재하는 값을 리턴
findValue = set.filter((element)=>{
return (element.X === x && element.Y === y)
})
if(findValue.length !== 0)
str = str.concat('*')
else
str = str.concat('.')
}
//모은 *.합을 push
answer.push(str);
}
return answer
}
- 정수 포인트 지점찾기
- 중복 부분 처리
- 만들 최소영역 찾기
- 영역에 따르는 결과 찾기
function solution(line) {
let [minX, maxX] = [Infinity, -Infinity];
let [minY, maxY] = [Infinity, -Infinity];
const intersectionPoints = _getIntersectionPoints(line);
return _draw(intersectionPoints);
function _getIntersectionPoints(line) {
const intersectionPoints = {};
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 [x, y] = [
(B * F - E * D) / (A * D - B * C),
(E * C - A * F) / (A * D - B * C),
];
if (A * D - B * C && Number.isInteger(x) && Number.isInteger(y)) {
[minX, maxX] = [Math.min(minX, x), Math.max(maxX, x)];
[minY, maxY] = [Math.min(minY, y), Math.max(maxY, y)];
intersectionPoints[`${[x, y]}`] = true; //stringify
}
}
}
return intersectionPoints;
}
function _draw(intersectionPoints) {
const drawStack = [];
for (let i = maxY; i >= minY; i--) {
let row = '';
for (let j = minX; j <= maxX; j++) {
const rowElement = intersectionPoints[`${j},${i}`] ? '*' : '.';
row += rowElement;
}
drawStack.push(row);
}
return drawStack;
}
}
- 코드수가 확실히 적다.
- 내부함수로 내부에서만 쓰일 함수를 지정해 놓았다.
- 내부함수에는
_
를 앞에 붙였다.[
${[x, y]}]
를 이용했다.- Hash map을 이용하여 교점이 중복될 때 중복을 해결해준다.
(같은 부분을 결국 true로 설정하니)
이부분이 나처럼 배열로 했을때 new Set을 쓰지않고 풀 수 있는 부분이다.
백틱${ 값 }백틱
, 백틱${배열}백틱
const a=10,b=20,c=30,d=40
const x = `${a,b,c,d}`, y = `${[a,b,c,d]}`, z = `${a+b+c+d}`
x //'40'
y //'10,20,30,40'
z //'100'
값만 ,를 통해 입력할경우 마지막 값만 적용되고
+
로 나누었을때는 값을 계산후 결과가 나오고
해당 부분을 배열로 만들면 전부 ,를 통해 구분되며 나타난다.