선분 세 개로 삼각형을 만들기 위해서는 다음과 같은 조건을 만족해야 합니다.
삼각형의 세 변의 길이가 담긴 배열 sides
이 매개변수로 주어집니다. 세 변으로 삼각형을 만들 수 있다면 1, 만들 수 없다면 2를 return하도록 solution 함수를 완성해주세요.
sides
의 원소는 자연수입니다.sides
의 길이는 3입니다.sides
의 원소 ≤ 1,000sides | result |
---|---|
[1, 2, 3] | 2 |
[3, 6, 2] | 2 |
[199, 72, 222] | 1 |
입출력 예 #1
입출력 예 #2
입출력 예 #3
// 오류난 코드!
const solution = (sides) => {
const max = Math.max(...sides);
const side = sides.filter(x => x!=max).reduce((sum, a) => sum + a);
return max >= side ? 2 : 1;
}
/* 내가 처음 작성한 코드이다. 코드 실행을 하면 통과가 나오는데 제출 후 채점하기를 하면 테스트 실패로
뜬다. 뭐가 문제인지 찾아보다가 sides.filter(x => x!=max)에서 가장 큰 값인
max를 제거한 새로운 배열을 만들고, 나머지 수들의 합을 구하고 있다.
그러나 같은 값이 두 번 이상 나오면 필터링이 모든 해당 항목을 제거해버리므로, 런타임 오류가 발생한다. */
// 다시 수정한 코드
const solution = (sides) => {
const max = Math.max(...side);
const side = sides.reduce((sum, a) => sum + a) - max;
return max >= side ? 2 : 1;
}
/* filter를 사용하지 않고 바로 reduce로 sides의 합을 구해준 후 max를 빼주었다.
이렇게 작성해주면코드 오류 발생없이 코드를 실행할 수 있다. */
const solution = (sides) => {
const sort = sides.sort((a, b) => b - a);
return sort[0] >= sort[1] + sort[2] ? 2 : 1;
}
/* 다른 풀이를 생각해 보다가 sort 메서드를 사용해서 내림차순으로 정렬해준 후 삼항 연산자로
풀어주어도 더 간단하게 작성할 수 있을거같아서 작성해 보았다. */
function solution(sides) {
sides.sort((a,b)=>a-b);
const t = sides.pop();
return sides.reduce((a,b)=>a+b) > t ? 1 : 2
}
/*
다른 분의 풀이를 보다가 pop을 사용해서 원본 배열을 직접 변경해주는 방식으로 작성한 코드가 신기해서
가져와봤다.
1. sort를 이용해서 오름차순으로 정렬을 해준다.
2. t에 젤 큰 값을 pop해준다.(제거된 값이 t에 저장된다.)
3. reduce를 이용해서 젤 큰수가 제거 된 상태에서 더해준 후 t(젤 큰수)와 비교하여 삼항연산자로 풀어준다.
*/