알고리즘 문제/프로그래머스

프로그래머스 당구 연습 [Lv. 2] (C++)

우대비 2024. 10. 21. 11:21
반응형
 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

원쿠션으로 당구를 칠때 목표 지점까지의 거리를 구하라

 

 

풀이 방법

현재 위치 -> 벽면 위치까지 이동하는 거리를 x1,y2라고 하고 벽면 위치 -> 목표 위치 까지 이동하는 거리를 x2, y2라고 할때 출력해야하는 거리는 x1+x2의 제곱 + y1+y2의 제곱입니다.

 

거리를 구하는 방법을 알았으니 모든 면에 대해서 거리를 구해주면 됩니다.

int by = balls[i][1];
int bx = balls[i][0];
int midY = (startY + by) / 2;
int midX = (startX + bx) / 2;

pair<int, int> up = {midX, n};
pair<int, int> down = {midX, 0};
pair<int, int> left = {0, midY};
pair<int, int> right = {m, midY};

int upCost = pow(abs(up.first - startX) + abs(bx - up.first),2) +
    pow(abs(up.second - startY) + abs(by - up.second), 2);

int downCost = pow(abs(down.first - startX) + abs(bx - down.first),2) +
    pow(abs(down.second - startY) + abs(by - down.second), 2);

int leftCost = pow(abs(left.first - startX) + abs(bx - left.first),2) +
    pow(abs(left.second - startY) + abs(by - left.second), 2);

int rightCost = pow(abs(right.first - startX) + abs(bx - right.first),2) +
    pow(abs(right.second - startY) + abs(by - right.second), 2);

 

이후 가장 작은 값을 answer 배열에 넣어주면 되는데

원쿠션이라는 조건이 붙어있으니 일직선으로 도달하는 경우를 제외해줍니다.

 

if (by == startY)
{
    if (bx > startX)
        rightCost = MAX;
    else 
        leftCost = MAX;
}

else if (bx == startX)
{
    if (by > startY)
        upCost = MAX;
    else
        downCost = MAX;
}

    answer.push_back(GetMin(upCost, downCost, leftCost, rightCost));

 

정답 코드

#include <string>
#include <vector>
#include <cmath>
#include <iostream>

using namespace std;
int MAX = 99999999;
int GetMin(int a, int b, int c, int d)
{
    return min(a, min(b, min(c, d)));
}

vector<int> solution(int m, int n, int startX, int startY, vector<vector<int>> balls) {
    vector<int> answer;
    
    for (int i = 0; i < balls.size(); i++)
    {
        int by = balls[i][1];
        int bx = balls[i][0];
        int midY = (startY + by) / 2;
        int midX = (startX + bx) / 2;
        
        pair<int, int> up = {midX, n};
        pair<int, int> down = {midX, 0};
        pair<int, int> left = {0, midY};
        pair<int, int> right = {m, midY};

        int upCost = bx == startX && by > startY ? MAX : 
                pow(abs(up.first - startX) + abs(bx - up.first),2) +
                pow(abs(up.second - startY) + abs(by - up.second), 2);
        
        int downCost = bx == startX && by < startY ? MAX : 
                pow(abs(down.first - startX) + abs(bx - down.first),2) +
                pow(abs(down.second - startY) + abs(by - down.second), 2);

        int leftCost = by == startY && bx < startX ? MAX : 
                pow(abs(left.first - startX) + abs(bx - left.first),2) +
                pow(abs(left.second - startY) + abs(by - left.second), 2);
        
        int rightCost = by == startY && bx > startX ? MAX :
                pow(abs(right.first - startX) + abs(bx - right.first),2) +
                pow(abs(right.second - startY) + abs(by - right.second), 2);
        
  
        answer.push_back(GetMin(upCost, downCost, leftCost, rightCost));
    }
    
    return answer;
}
반응형
LIST