본문 바로가기
Problem Solving/프로그래머스

프로그래머스 당구 연습 - C++ 풀이

by 어멘드 2023. 9. 5.
반응형

 

1. 4개의 벽면을 맞추는 경우를 모두 탐색하고 최소거리를 구한다.
2. 만약 벽면에 맞기 전에 공을 먼저 맞는 경우 원쿠션이 되지 않으므로 제외한다.

 

1. 4개의 벽면을 맞추는 경우를 모두 탐색하고 최소거리를 구한다.

 벽면이 총 4개 있으므로, 각 벽면을 맞추는 경우를 모두 탐색한 다음 최소거리를 구하면 된다. 벽면을 맞추고 공을 맞추기 위해 이동해야 하는 거리는 해당 벽면을 기준으로 목표공을 대칭이동 시킨 뒤 시작점과의 거리를 계산하면 된다.

 

2. 만약 벽면에 맞기 전에 공을 먼저 맞는 경우 원쿠션이 되지 않으므로 제외한다.

 주의해야 하는 부분은 벽면을 맞추고 난 뒤에 목표공을 맞추는 것이 불가능할 수 있다는 점이다. 벽면으로 가는 경로에 목표공이 존재하는 경우에 해당한다. 

 


#include <string>
#include <vector>

using namespace std;

typedef long long ll;

const ll INF = 987564321;

ll dist(ll startX, ll startY, ll x, ll y) {
    ll dx = startX - x;
    ll dy = startY - y;
    return dx*dx + dy*dy;
}

vector<int> solution(int m, int n, int startX, int startY, vector<vector<int>> balls) {
    vector<int> answer;
    
    // 각 벽면을 축으로 대칭이동한다음 시작점과의 거리 구하면 됨
    for (auto ball: balls) {
        int x = ball[0];
        int y = ball[1];
        
        ll minDist = INF;
        
        // 상
        if (!(x == startX && y > startY)) {
            minDist = min(minDist, dist(startX, startY, x, n+n-y));
        }
        // 우
        if (!(y == startY && x > startX)) {
            minDist = min(minDist, dist(startX, startY, m+m-x, y));
        }
        // 하
        if (!(x == startX && y < startY)) {
            minDist = min(minDist, dist(startX, startY, x, -y));
        }
        // 좌
        if (!(y == startY && x < startX)) {
            minDist = min(minDist, dist(startX, startY, -x, y));
        }
    
        answer.push_back(minDist);
    }
    
    return answer;
}
반응형

댓글