해당 문제는 세 가지 경우를 구해야 합니다. 하나는 주어진 두 변 중 가장 큰 변(max)을 찾는 것과, 가장 작은 변(min)을 찾는 것.
또 하나는 찾은 큰 값(max)이 나머지 작은 값과 구해야 할 값의 함(min + n)보다 작을 때 까지 n을 증가시키는 경우
마지막은 찾아야 할 값(n)이 긴 변일 때 나머지 max와 min의 합보다 작아야 하는 경우로 볼 수 있는데요. 예제를 예시로 들어 설명을 해보겠습니다.
★ [3,6] 이 주어졌을 때
6이 긴 변일때 : 6은 3+n의 합보다 작아야 함 -> 6 < 3+n = 4 5 6
n이 긴 변일때 n은 6+3의 합보다 작아야함 -> n < 9(6+3) = 7 8
합계 -> 5★ [11,7] 이 주어졌을 때
11이 긴 변일때 11은 7+n의 합보다 작아야 함 -> 11 < 7+n = 5, 6, 7, 8, 9, 10, 11
n이 긴 변일때 n은 11+7의 합보다 작아야함 -> n < 18(11+7) = 12, 13, 14, 15, 16, 17
합게 -> 13즉 정리하자면, 작은 가장 긴 변보다 작은 값과 찾아야 할 값을 합친 숫자가 가장 긴 변보다 큰 때부터 두 변을 더한 값 까지가 임의의 변에 포함될 수 있는 개수인 것이죠. 공식으로 하면 다음과 같은데요.
(max + min) - ((max - min) + 1) = result
그럼 해당 공식을 적용한 자바스크립트 버전을 소개해 드리겠습니다.
- 자바스크립트 버전
function solution(sides) { let sum = sides.reduce((acc, cur) => { return acc + cur }) let min = Math.min(...sides) let max = Math.max(...sides) let result = 0; for(let i = 1 ; i < sum ; i++){ if((i + min) > max){ ++result; } } return result }
그리고 위에서 소개해 드린 공식으로 자바 코드를 짠다면 JS 버전보다 더 쉽게 코드를 구현할 수 있습니다.
- 자바 버전
import java.util.Arrays; class Solution { public static int solution(int[] sides) { Arrays.sort(sides); int result = (sides[1] + sides[0]) - ((sides[1] - sides[0]) + 1); return result; } }