문제
길이가 서로 다른 a, b, c 막대가 주어지면, 이 세 막대로 삼각형을 만들 수 있으면 "YES"를 출력, 만들 수 없으면 "NO"를 출력한다.
(정렬을 사용하지 않고 실행해야한다.)
나의 풀이
function solution(a, b, c) {
let answer = "YES";
let max = a;
let min1;
let min2;
if (max < b) {
[max, min1] = [b, max];
} else {
min1 = b;
}
if (max < c) {
[max, min2] = [c, max];
} else {
min2 = c;
}
if (max < min1 + min2) answer = "NO";
return answer;
}
console.log(solution(6, 7, 11));
console.log(solution(13, 33, 17));
기본지식
삼각형이 성립하려면 ?
- 삼각형의 가장 긴 변의 길이가, 나머지 두 변의 길이의 합보다 작아야 한다.
문제 원인
- 정렬 없이 어떻게 해야 할지에 대해 초점을 두다 보니, max값을 제외한 나머지 두 값을 알아야 한다고 생각했다.
- 그 결과, min1, min2라는 새로운 변수를 추가시켰고 결국 상황에 따른 많은 if문들이 이어질 수 밖에 없었다.
해결 방안
- 가장 큰 값과, 나머지 두 값의 합을 비교해야 한다.
- a, b, c를 합하고 가장 큰 값을 빼주면, 나머지 두 값의 합이 되므로 이와 비교해주면 된다.
새로운 풀이
function solution(a, b, c) {
let answer = "YES";
let max = a;
let sum = a + b+ c;
if (max < b) max = b;
if (max < c) max = c;
if (max > sum - max) answer = "NO";
return answer;
}
console.log(solution(6, 7, 11));
console.log(solution(13, 33, 17));
- 다음과 같이 if문의 개수를 많이 줄일 수 있었다.
다르게 풀어보기
function solution(a, b, c) {
let max = a;
if (max < b) max = b;
if (max < c) max = c;
return (max < a + b + c - max) ? "YES" : "NO";
}
console.log(solution(6, 7, 11));
console.log(solution(13, 33, 17));
- answer, sum 변수를 만들지 않았다.
- return에서 삼항연산자를 사용하였다.
추가 이론) 삼항연산자
삼항 연산자는 세 개의 피연산자를 취할 수 있는 유일한 연산자로, 보통 if 명령문의 단축 형태로 쓰인다.
if (A) {
B
} else{
C
}
A ? B : C;
- 다음과 같이 삼항연산자는 if,else문의 단축 형태로 쓰인다.
- A 조건이 참이면 B를 실행하고, 거짓이면 C를 실행하므로 return을 줄 때 조건에 따라 다른 리턴을 주도록 할 수 있다.
'DS & Algorithm > basic' 카테고리의 다른 글
[기초 알고리즘] 멘토링 - 자바스크립트 (0) | 2021.04.18 |
---|---|
[기초 알고리즘] 가장 짧은 문자거리 - 자바스크립트 (0) | 2021.04.16 |
[기초 알고리즘] 봉우리 - 자바스크립트 (0) | 2021.04.08 |
[기초 알고리즘] 등수 구하기 - 자바스크립트 (0) | 2021.04.08 |
[기초 알고리즘] 최솟값 구하기 - 자바스크립트 (0) | 2021.04.07 |