문제
https://school.programmers.co.kr/learn/courses/30/lessons/169198
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문제 풀이
해당 문제는 하나의 공(startX, startY)를 가지고 주어진 공들(balls)들을 원 쿠션으로 맞추는 방법 중 가장 짧은 케이스의 길이의 제곱을 구하는 문제이다.
이 문제는 시작하는 공에서 벽, 벽에서 맞추어야 하는 공까지의 거리를 구하여 더할 수도 있지만, 간단하게 벽을 기준으로 하나의 공을 반전시켜 해당 공과의 거리를 구하면 이동 거리를 쉽게 구할 수 있다.
위 과정을 위 오른쪽 아래 왼쪽 벽과 반전하여 거리를 구하면 쉽게 구할 수 있다.
이때 두 공이 해당 벽에 같은 수선의 발을 가질 경우에 시작하는 공이 목표 공을 원 쿠션을 맞추기 전에 맞을 수 있으므로 해당 경우는 꼭 예외 처리를 해야 한다.
해결 코드
function solution(m, n, startX, startY, balls) {
var answer = [];
const rightWall = ([a,b],[x,y]) =>{
if(b === y && a < x) return Number.MAX_VALUE;
return Math.pow(a-(2 * m - x),2)+Math.pow(b-y,2);
}
const leftWall = ([a,b],[x,y]) =>{
if(b === y && a > x) return Number.MAX_VALUE;
return Math.pow(a+x,2)+Math.pow(b-y,2)
}
const upWall = ([a,b],[x,y]) =>{
if(a === x && b < y) return Number.MAX_VALUE;
return Math.pow(a-x,2)+ Math.pow(b-(2 * n - y),2)
}
const downWall = ([a,b],[x,y]) =>{
if(a === x && b > y) return Number.MAX_VALUE;
return Math.pow(a-x,2)+Math.pow(b+y,2)
}
balls.forEach((ball) => {
answer.push(Math.min(
rightWall([startX,startY],ball),
leftWall([startX,startY],ball),
upWall([startX,startY],ball),
downWall([startX,startY],ball)))
})
return answer;
}
'algorithm > problems' 카테고리의 다른 글
[백준 / Java] 1504번 : 특정한 최단 경로 (0) | 2023.07.24 |
---|---|
[백준 / Java] 17626번 Four Squares (0) | 2023.07.23 |
[프로그래머스 / Javascript] 전력망을 둘로 나누기 (0) | 2023.06.01 |
[프로그래머스 / C++] 이모티콘 할인행사 (0) | 2023.05.19 |
[프로그래머스 / C++] 롤케이크 자르기 (0) | 2023.05.18 |