문제
선분 세 개로 삼각형을 만들기 위해서는 다음과 같은 조건을 만족해야 합니다.
- 가장 긴 변의 길이는 다른 두 변의 길이의 합보다 작아야 합니다.
삼각형의 두 변의 길이가 담긴 배열 sides이 매개변수로 주어집니다. 나머지 한 변이 될 수 있는 정수의 개수를 return하도록 solution 함수를 완성해주세요.
제한사항
- sides의 원소는 자연수입니다.
- sides의 길이는 2입니다.
- 1 ≤ sides의 원소 ≤ 1,000
입출력 예
[1, 2] | 1 |
[3, 6] | 5 |
[11, 7] | 13 |
입출력 예 설명
입출력 예 #1
- 두 변이 1, 2 인 경우 삼각형을 완성시키려면 나머지 한 변이 2여야 합니다. 따라서 1을 return합니다.
입출력 예 #2
- 가장 긴 변이 6인 경우
- 될 수 있는 나머지 한 변은 4, 5, 6 로 3개입니다.
- 나머지 한 변이 가장 긴 변인 경우
- 될 수 있는 한 변은 7, 8 로 2개입니다.
- 따라서 3 + 2 = 5를 return합니다.
입출력 예 #3
- 가장 긴 변이 11인 경우
- 될 수 있는 나머지 한 변은 5, 6, 7, 8, 9, 10, 11 로 7개입니다.
- 나머지 한 변이 가장 긴 변인 경우
- 될 수 있는 한 변은 12, 13, 14, 15, 16, 17 로 6개입니다.
- 따라서 7 + 6 = 13을 return합니다.
문제의 조건은 '가장 긴 변의 길이는 다른 두 변의 길이의 합보다 작아야 합니다.' 이다.
따라서 세 변이 각각 a, b, c라고 하고 a가 가장 긴 변의 길이라면 'a < b + c' 이어야 한다는 것이다.
function solution(sides) {
const max = Math.max(...sides);
const diff = max - Math.min(...sides);
const sum = sides.reduce((acc, cur) => {
return acc + cur;
});
return (max - diff) + (sum - max - 1);
}
나는 입출력 예를 가지고 풀다 보니 다음과 같은 코드가 나오게 되었다.
(max - diff) 의 경우 배열의 최댓값 - 최솟값의 차이로 세번째 변이 가질 수 있는 최소값 이상의 수를 의미한다.
(sum - max - 1) 의 경우 세 번째 변이 가질 수 있는 최댓값 이하의 수를 의미한다.
아무래도 생각의 흐름대로 풀다 보니 이런 코드가 나오게 되었다.
하지만 더 쉽게 풀이하려면 다음과 같이 정리할 수 있다.
주어진 sides 배열이 [a, b] 이고 주어지지 않은 나머지 한 변의 길이를 x라고 했을 때,
1. x < a + b
2. a < x + b 혹은 b < x + a
이 두 경우를 만족해야 하는 모든 수의 개수를 구해야 한다.
2번의 경우, x > | a - b | 이므로 코드로 변환하면 x > Math.abs(a - b) 가 된다.
따라서 Math.abs(a - b) < x < a + b라는 식이 나오게 된다.
x의 범위를 정리하자면 다음과 같다.
- x는 Math.abs(a - b) + 1부터 가능하다.
- x는 최대 a + b - 1까지 가능하다.
식으로 표현하면 다음과 같다.
x = (a+b−1)−(|a−b|+1)+1 = a+b−1−|a−b|−1+1=a+b−|a−b|−1
a 와 b 중, 큰 값을 max, 작은 값을 min이라고 하면
min + max - (max - min) - 1 = min + max - max + min - 1 = 2 * min - 1 이라는 결론이 나온다.
function solution(sides) {
return Math.min(...sides)*2-1
}
위의 코드가 가장 정석적이고 깔끔한 최종 코드이다.
이 문제는 단순 코딩 풀이 문제를 넘어선 수학 문제라고도 볼 수 있을 것 같다.
역시 수학 공부도 꾸준히 해야 하는 것을 느끼며 정리 끝...
'개발 > 문제풀기' 카테고리의 다른 글
[프로그래머스] Lv.0 자바스크립트 문제 정리 (2) (0) | 2024.10.28 |
---|---|
[프로그래머스] Lv.1 바탕화면 정리 자바스크립트 (0) | 2024.10.18 |
[프로그래머스] Lv.0 자바스크립트 문제 정리 (1) | 2024.10.18 |