문제 설명

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

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

삼각형의 세 변의 길이가 담긴 배열 sides이 매개변수로 주어집니다. 세 변으로 삼각형을 만들 수 있다면 1, 만들 수 없다면 2를 return하도록 solution 함수를 완성해주세요.


제한사항

  • sides의 원소는 자연수입니다.
  • sides의 길이는 3입니다.
  • 1 ≤ sides의 원소 ≤ 1,000

입출력 예

sidesresult
[1, 2, 3]2
[3, 6, 2]2
[199, 72, 222]1

입출력 예 설명

입출력 예 #1

  • 가장 큰 변인 3이 나머지 두 변의 합 3과 같으므로 삼각형을 완성할 수 없습니다. 따라서 2를 return합니다.

입출력 예 #2

  • 가장 큰 변인 6이 나머지 두 변의 합 5보다 크므로 삼각형을 완성할 수 없습니다. 따라서 2를 return합니다.

입출력 예 #3

  • 가장 큰 변인 222가 나머지 두 변의 합 271보다 작으므로 삼각형을 완성할 수 있습니다. 따라서 1을 return합니다.

✍ SOLUTION1

// 오류난 코드! 

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를 빼주었다.
이렇게 작성해주면코드 오류 발생없이 코드를 실행할 수 있다. */

✍ SOLUTION2

const solution = (sides) => {
	const sort = sides.sort((a, b) => b - a);
	return sort[0] >= sort[1] + sort[2] ? 2 : 1;
}

/* 다른 풀이를 생각해 보다가 sort 메서드를 사용해서 내림차순으로 정렬해준 후 삼항 연산자로 
풀어주어도 더 간단하게 작성할 수 있을거같아서 작성해 보았다. */

✍ SOLUTION3

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(젤 큰수)와 비교하여 삼항연산자로 풀어준다.
*/

출처 : 프로그래머스 스쿨 | 코딩테스트 연습

0개의 댓글

Powered by GraphCDN, the GraphQL CDN