Pepperminttt
Pepperminttt's Dev
Pepperminttt
전체 방문자
오늘
어제
  • devInfo (86)
    • forBeingGoodDeveloper (2)
    • React (2)
      • LostArk Open API (1)
    • algorithm (58)
      • problems (44)
      • theory (14)
    • computerScience (8)
      • network (8)
    • javaScript (8)
    • Java (4)
    • web (2)
      • webApplication (2)
    • etc. (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • Java
  • 탐욕법
  • node.js
  • C++
  • JavaScript
  • Network
  • BFS
  • 그래프
  • dfs문제
  • DP
  • 알고리즘
  • greedy
  • 프로그래머스
  • 백준
  • bfs문제
  • 탐욕법 문제
  • dfs
  • 벨만-포드
  • solved.ac
  • DP문제

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
Pepperminttt

Pepperminttt's Dev

[프로그래머스 / Javascript] 당구 연습
algorithm/problems

[프로그래머스 / Javascript] 당구 연습

2023. 6. 16. 16:46

문제

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
    'algorithm/problems' 카테고리의 다른 글
    • [백준 / Java] 1504번 : 특정한 최단 경로
    • [백준 / Java] 17626번 Four Squares
    • [프로그래머스 / Javascript] 전력망을 둘로 나누기
    • [프로그래머스 / C++] 이모티콘 할인행사
    Pepperminttt
    Pepperminttt
    HTML, JavaScript, Python 등 Computer language TIL

    티스토리툴바