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 | 31 |
Tags
- SQL 고득점 KIT
- Dynamic Programming
- Lv. 1
- 너비 우선 탐색
- Python
- level3
- softeer
- 파이썬
- 소프티어
- Lv. 3
- level 3
- Java
- C언어
- DP
- dfs
- Typescript
- 브루트포스
- bfs
- 다이나믹프로그래밍
- 문자열
- 스택
- 자바스크립트
- javascript
- 프로그래머스
- group by
- Stack
- Lv. 0
- Lv. 2
- programmers
- 타입스크립트
Archives
- Today
- Total
몸과 마음이 건전한 SW 개발자
프로그래머스 [Lv. 2] 당구 연습 {언어 : JavaScript} 본문
문제 링크
https://school.programmers.co.kr/learn/courses/30/lessons/169198
정답 코드
function solution(m, n, startX, startY, balls) {
const answer = [];
const calc = (nx, ny) => {
return (startX - nx) ** 2 + (startY - ny) ** 2;
};
const crossFC = (nx, ny) => {
return nx * n == ny * m || m * ny == n * m - n * nx;
};
const isCross = crossFC(startX, startY) ? true : false;
balls.forEach(([x, y]) => {
let minV = 8000001;
// 대각선에 있는 경우
if (isCross && crossFC(x, y)) {
if (x > startX && y > startY) {
// 우상
minV = Math.min(minV, (m-x)**2+(n-y)**2+(m-startX)**2+(n-startY)**2);
} else if (x > startX && y < startY) {
// 우하
minV = Math.min(minV, (m-x)**2+y**2+(m-startX)**2+startY**2);
} else if (x < startX && y > startY) {
// 좌상
minV = Math.min(minV, x**2+(n-y)**2+startX**2+(n-startY)**2);
} else {
// 좌하
minV = Math.min(minV, x**2+y**2+startX**2+startY**2);
};
};
const udlr = [[x, -y], [x, (n-y)*2+y], [-x, y], [(m-x)*2+x, y]];
if (y == startY) {
for (let i = 0; i < 2; i++) {
const [nx, ny] = udlr[i];
minV = Math.min(minV, calc(nx, ny));
};
if (x > startX) {
minV = Math.min(minV, (x+startX)**2);
} else {
minV = Math.min(minV, (2*m-x-startX)**2);
};
} else if (x == startX) {
for (let j = 2; j < 4; j++) {
const [nx, ny] = udlr[j];
minV = Math.min(minV, calc(nx, ny));
};
if (y > startY) {
minV = Math.min(minV, (y+startY)**2);
} else {
minV = Math.min(minV, (2*n-y-startY)**2);
};
} else {
for (let k = 0; k < 4; k++) {
const [nx, ny] = udlr[k];
minV = Math.min(minV, calc(nx, ny));
};
};
answer.push(minV);
});
return answer;
}
풀이 방법
- startX, startY가 대각선에 위치하는지 확인한다.
- x, y도 대각선에 위치하는지 확인한다.
- 대각선에 위치하는 경우
- 어떤 모서리에 먼저 닿을지 확인한다.
- x나 y가 평행선에 있는지 확인한다.
- 평행선인 경우 평행하게 벽을 맞춘 거리 값도 같이 계산한다.
- 평행이 아닌 경우 벽 4개를 다 부딪혀본다고 생각한다.
- 마지막으로 minV를 answer에 넣는다.
느낀점
- 이건 수학 문제다.
'알고리즘' 카테고리의 다른 글
프로그래머스 [Lv. 2] 미로 탈출 {언어 : JavaScript} (0) | 2024.04.14 |
---|---|
프로그래머스 [Lv. 2] 혼자서 하는 틱택토 {언어 : Python} [반례 포함] (0) | 2024.04.12 |
프로그래머스 [Lv. 2] 리코쳇 로봇 {언어 : JavaScript} (0) | 2024.04.10 |
프로그래머스 [Lv. 2] 광물 캐기 {언어 : Python} (0) | 2024.04.09 |
프로그래머스 [Lv. 2] 과제 진행하기 {언어 : JavaScript} (0) | 2024.04.08 |