문제 설명
풀이 : Success
소스 코드
public static String kangaroo(int x1, int v1, int x2, int v2) {
// Write your code here
BigDecimal distance;
BigDecimal speedGap;
if (v1 > v2) {
distance = new BigDecimal(x2 - x1);;
speedGap = new BigDecimal(v1 - v2);
}
else {
return "NO";
}
BigDecimal result;
try {
result = distance.divide(speedGap);
} catch (ArithmeticException e) {
return "NO";
}
if (result.remainder(BigDecimal.ONE) == BigDecimal.ZERO) return "YES";
else return "NO";
}
풀이 회고
문제에서 요구하는 것은 캥거루1과 캥거루2의 위치와 속도가 주어졌을 때 이들이 같은 시간에 같은 위치에 만날 수 있는지 여부이다. 이때 캥거루1의 위치는 캥거루2의 위치보다 항상 뒤에 있으므로 캥거루1은 캥거루2 보다 항상 속도가 빨라야 한다. 만일 그렇지 않다면 바로 "NO"를 반환하도록 했다. 이 문제는 방정식을 세워서 조건 성립 여부를 판단할 수도 있었다.
캥거루1의 위치와 속도는 x1, v1이며, 캥거루2의 위치와 속도는 x2, v2이다. 이때 n은 점프 횟수로서 임의의 자연수이다. 예를 들어 점프를 1.5회 할 수는 없기 때문이다. 즉 위 방정식을 구했을 때 n(=위치차/속도차)이 자연수가 나오면 "YES"를 반환하면 되는 것이다.
우선 입력받은 캥거루들의 위치와 속도를 통해 캥거루의 위치 차이와 속도차이를 구했다. 이때 BigDecimal을 통해 값을 저장했다. 왜냐하면 위 방정식을 연산하는 과정에서 n의 값이 무한 소수점의 실수인 경우도 발생할텐데 이 경우 기존의 double 자료형은 부동소수점 방식으로 실수를 저장하기 때문에 정상적으로 이 값을 저장할 수 없기 때문이다. n이 자연수인지를 판단하려면 값을 받아와야 한다고 생각했다. BigDecimal 역시 무한 소수점을 저장할 수는 없지만 ArithmeticException 예외를 발생하기 때문에 예외처리를 통해 "NO"를 반환시켜줄 수는 있었다.
자연수임을 판단하는 방법으로는 1이라는 수로 해당 수(=위치차/속도차)에 대해 나머지 연산을 할 때 0과 일치하다는 특성을 이용했다. 조건이 일치하면 "YES"를 반환하고 일치하지 않으면 "NO"를 반환하도록 했다.
모범 소스 코드
public static String kangaroo(int x1, int v1, int x2, int v2) {
if (v1>v2&&(x2-x1)%(v1-v2)==0)
return "YES";
else
return "NO";
}
풀이 회고
위 풀이는 HackerRank 미국 User cpcs님의 풀이다. 나와 풀이 접근 자체는 동일했으나, 나의 경우는 캥거루들의 위치차와 속도차를 구해 별도의 자료형에 저장하여 연산 및 정답을 구하고자 했었던 반면, 위 풀이에서는 별도의 자료형에 저장하지 않고 주어진 변수 자체를 그대로 활용하여 연산 및 정답을 구하고자 했다. 이 경우라면 무한 소수점 값 저장 이슈가 발생하지 않으므로 별다른 메모리 할당 없이 단순하게 정답을 구할 수 있었다.
'Algorithm > HackerRank' 카테고리의 다른 글
[HackerRank] Save the Prisoner! - Java (0) | 2022.01.27 |
---|---|
[HackerRank] Time Conversion - Java (0) | 2022.01.26 |
[HackerRank] Diagonal Difference - Java (0) | 2022.01.26 |