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
- programmers
- SQL
- Python
- 오블완
- Lv. 2
- 프로그래머스
- 깊이 우선 탐색
- level 3
- DP
- softeer
- 동적계획법
- 소프티어
- bfs
- 파이썬
- Dynamic Programming
- SQL 고득점 KIT
- 너비 우선 탐색
- C언어
- LEVEL 2
- Lv. 0
- 티스토리챌린지
- join
- group by
- select
- dfs
- Lv. 3
- javascript
- 자바스크립트
- Java
- Lv. 1
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 |