본문 바로가기

개발/문제풀기

[프로그래머스] LV.0 삼각형의 완성조건 (2) 자바스크립트

728x90

 

문제

선분 세 개로 삼각형을 만들기 위해서는 다음과 같은 조건을 만족해야 합니다.

  • 가장 긴 변의 길이는 다른 두 변의 길이의 합보다 작아야 합니다.

삼각형의 두 변의 길이가 담긴 배열 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+b1)(|ab|+1)+1 = a+b1−|ab|1+1=a+b−|ab|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
}

 

위의 코드가 가장 정석적이고 깔끔한 최종 코드이다.

이 문제는 단순 코딩 풀이 문제를 넘어선 수학 문제라고도 볼 수 있을 것 같다.

역시 수학 공부도 꾸준히 해야 하는 것을 느끼며 정리 끝...

 

300x250