반응형
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
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
'알고리즘 문제 > 프로그래머스' 카테고리의 다른 글
프로그래머스 유사 칸토어 비트열 [Lv. 2] (C++) (0) | 2024.10.22 |
---|---|
프로그래머스 업그레이드 된 아이템 구하기 [Lv. 2] (MySQL) (0) | 2024.10.21 |
프로그래머스 올바른 괄호 [Lv. 2] (C++) (0) | 2024.10.19 |
프로그래머스 연도별 대장균 크기의 편차 구하기 [Lv. 2] (MySQL) (0) | 2024.10.17 |
프로그래머스 조건에 맞는 개발자 찾기 [Lv. 2] (MySQL) (1) | 2024.10.16 |