Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
Tags
- next.js msw
- createPortal
- 알고리즘JS
- react cypress
- msw
- Next.js
- 스토리북
- react-table
- 자바스크립트 동향
- 테스트코드 자동화
- Queue
- 말줄임 툴팁 만들기
- js
- 카카오엔터프라이즈 인턴
- 2023 자바스크립트
- ₩1
- 테오의스프린트
- 알고리즘
- storybook
- TC39
- MinHeap
- 리액트 파이버
- storybook styled-components
- ssg
- fsd
- 자바스크립트로 코딩테스트
- storybook 커스텀
- 이펙티브 타입스크립트
- ISR
- 프론트엔드 아키텍처
Archives
- Today
- Total
MEI
[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 |