문제 원문을 확인한 뒤 직접 풀이해 보세요. 해설과 정답은 아래 접힌 영역에서 확인할 수 있습니다.
문제
문제 설명
길이가 서로 다른 A, B, C 세 개의 막대 길이가 주어지면 이 세 막대로 삼각형을 만들 수 있으면 "YES"를 출력하고, 만들 수 없으면 "NO"를 출력한다.
입력 설명
첫 번째 줄에 100이하의 서로 다른 A, B, C 막대의 길이가 주어진다.
출력 설명
첫 번째 줄에 "YES", "NO"를 출력한다.
입력 예제 1
6 7 11
출력 예제 1
YES
입력 예제 1
13 33 17
출력 예제 1
NO
추가 제한 사항
풀이와 정답
풀이와 정답 보기 (클릭)
세 막대가 삼각형을 이루려면 어느 한 변의 길이도 나머지 두 변의 합보다 길거나 같아서는 안 됩니다. 세 조건을 모두 작성해도 되지만, 가장 긴 변만 정확히 찾으면 판단을 한 번으로 줄일 수 있습니다. 가장 긴 변이 조건을 만족하면 그보다 짧은 두 변에 대한 조건은 자연스럽게 만족하기 때문입니다.
따라서 세 길이의 전체 합과 최댓값을 구한 다음, 전체 합에서 최댓값을 빼 나머지 두 변의 합을 얻습니다. 나머지 합이 최댓값보다 클 때만 YES를 반환합니다. 두 값이 같은 경우에는 막대가 일직선으로 놓일 뿐 삼각형의 넓이가 생기지 않으므로 NO가 되어야 합니다.
알고리즘 설계

먼저 a + b + c를 계산해 total에 저장합니다. 이어서 Math.max(a, b, c)로 가장 긴 막대의 길이를 구합니다. 정렬은 세 값의 전체 순서를 만들지만, 이 문제에서 필요한 정보는 최댓값 하나뿐이므로 Math.max로 필요한 값만 구하는 편이 목적에 잘 맞습니다.
나머지 두 막대의 합은 total - maxLength입니다. 판별식은 total - maxLength > maxLength로 쓸 수 있습니다. 부등호가 반드시 엄격한 >여야 한다는 점이 중요합니다. 같을 때까지 허용하는 >=를 사용하면 삼각형이 될 수 없는 경계 조건을 잘못 통과시킵니다.
const total = a + b + c;
const maxLength = Math.max(a, b, c);
const restSum = total - maxLength;
return restSum > maxLength ? 'YES' : 'NO';
이 설계는 가장 긴 변의 위치와 무관하게 같은 식을 사용합니다. A가 가장 길든 B나 C가 가장 길든 Math.max가 기준값을 정하고, 전체 합에서 그 값을 한 번만 빼면 비교 대상이 만들어집니다. 여러 갈래의 조건문으로 같은 계산을 반복하지 않아 코드의 의도도 분명해집니다.
첫 번째 원문 예제에서는 전체 합이 24이고 최댓값이 11이므로 나머지 합은 13입니다. 13이 11보다 크기 때문에 삼각형을 만들 수 있고 결과는 YES입니다. 두 번째 예제에서는 전체 합이 63이고 최댓값이 33이므로 나머지 합은 30입니다. 30은 33보다 크지 않으므로 결과는 NO입니다.
JavaScript 풀이

완성 코드는 세 길이를 매개변수로 받는 solution 함수로 구성합니다. 제공된 작성 코드가 사용한 최댓값 비교와 전체 합 방식은 올바르므로 핵심 접근을 유지했습니다. 다만 answer, tot, max처럼 짧은 이름 대신 역할이 드러나는 total, maxLength, restSum을 사용해 계산의 의미를 바로 읽을 수 있게 했습니다.
완성 코드
function solution(a, b, c) {
const total = a + b + c;
const maxLength = Math.max(a, b, c);
const restSum = total - maxLength;
if (restSum > maxLength) {
return 'YES';
}
return 'NO';
}
console.log(solution(13, 33, 17));
코드 흐름 설명
total은 세 막대 길이의 합이고, maxLength는 가장 긴 막대의 길이입니다. restSum에는 가장 긴 막대를 제외한 두 막대의 길이 합이 저장됩니다. 세 변수의 이름이 각각 계산 결과를 설명하므로 조건식만 보아도 무엇을 비교하는지 확인할 수 있습니다.
조건문은 앞에서 만든 restSum과 maxLength를 그대로 연결합니다. 참이면 YES, 거짓이면 NO를 반환하며, 출력 문자열은 원문과 같은 대문자를 사용해야 합니다.
마지막 호출은 제공된 작성 코드와 같은 두 번째 원문 예제를 사용합니다. solution(13, 33, 17)은 논리상 NO를 반환합니다. 첫 번째 원문 예제를 확인하려면 같은 함수에 6, 7, 11을 전달하면 됩니다.
복잡도와 검증
입력은 항상 세 값으로 고정되어 있습니다. 덧셈, 최댓값 계산, 뺄셈과 비교가 각각 상수 횟수만 실행되므로 시간 복잡도는 O(1)입니다. 입력 크기에 따라 반복 횟수가 늘어나는 반복문이나 재귀 호출도 없습니다.
추가로 사용하는 값은 전체 합, 최댓값, 나머지 합뿐이므로 공간 복잡도도 O(1)입니다. 입력 배열을 정렬하거나 별도의 자료구조를 만들지 않아 세 값 외에 필요한 메모리가 고정되어 있습니다.
원문 예제는 두 방향을 모두 확인합니다. 6 7 11에서는 나머지 합 13이 최댓값 11보다 커서 YES가 되고, 13 33 17에서는 나머지 합 30이 최댓값 33보다 작아서 NO가 됩니다. 또한 두 값이 정확히 같은 경계에서는 엄격한 부등식이 거짓이므로 NO가 됩니다.
검증할 때는 최댓값의 위치가 달라지는 경우, 길이 상한 100 이하의 입력, 반환 문자열의 대소문자를 함께 확인하면 됩니다. JavaScript의 일반적인 숫자 범위에서 이 문제의 연산은 정밀도 문제 없이 처리됩니다.
핵심은 세 변의 순서를 모두 구하는 것이 아니라 가장 긴 변과 나머지 합의 관계만 확인하는 것입니다. 필요한 정보만 계산하면 문제 조건을 짧고 명확하게 코드로 옮길 수 있습니다.
같이 읽으면 좋은 글
풀이 전에 확인할 순서
- 입력값과 출력값을 한 문장으로 다시 적습니다.
- 반복할 대상과 비교·저장할 값을 정합니다.
- 필요한 자료구조와 시간복잡도를 예상합니다.
- 코드를 보기 전에 손으로 작은 예제를 계산합니다.
힌트: 삼각형 판별하기 JavaScript 풀이
정답 코드를 바로 따라 쓰기보다, 본문에서 값이 갱신되는 조건과 반복 범위를 먼저 찾으세요. 반복 한 번마다 반드시 유지되어야 하는 값이 무엇인지 적으면 풀이의 중심 변수를 고르기 쉽습니다.
테스트 확인
- 가능한 가장 작은 입력
- 같은 값이나 문자가 반복되는 입력
- 정답이 처음 또는 마지막 위치에서 결정되는 입력
- 입력 제한에 가까운 경우의 실행 시간
확인 결과: 본문의 예제뿐 아니라 위 경계 사례에서도 예상값과 실제 출력이 같아야 풀이가 완료됩니다.
이 글이 도움이 되었나요?
코딩테스트 JavaScript 학습 순서
필수 49개 · 전체 49개
읽음 기록 관리
전체 과정 목차 (49개)
- 필수 길잡이 · 코딩테스트 JS 자료구조 로드맵: 배열, 해시, 스택, 투 포인터 순서
- 필수 학습 · 세 수 중 최솟값 JavaScript 조건문 풀이 정리
- 필수 학습 · 삼각형 판별하기 JavaScript 풀이 현재 글
- 필수 학습 · 연필 개수 JavaScript 풀이
- 필수 학습 · 1부터 N까지 합 출력하기 JavaScript 풀이
- 필수 학습 · 최솟값 구하기 JavaScript 풀이|배열 순회와 비교 갱신 원리
- 필수 학습 · 홀수 JavaScript 풀이: 조건 판별과 결과 처리 정리
- 필수 학습 · 10부제 JavaScript 풀이: 끝자리 비교로 위반 차량 수 세기
- 필수 학습 · A를 #으로 JavaScript 풀이: 문자열 순회와 치환
- 필수 학습 · 문자 찾기 JavaScript 풀이: 문자열 순회로 개수 세기
- 필수 학습 · 대문자 찾기 JavaScript 풀이
- 필수 학습 · 대문자로 통일 JavaScript 풀이
- 필수 학습 · 대소문자 변환 JavaScript 풀이
- 필수 학습 · 일곱 난쟁이 JavaScript 풀이: 두 명을 제외하는 완전탐색
- 필수 학습 · 코딩테스트 JS Map 풀이: 학급 회장 득표수 세기
- 필수 학습 · 코딩테스트 JS 스택 풀이: 올바른 괄호 검증하기
- 필수 학습 · 코딩테스트 JS 스택 풀이: 괄호문자 제거하기
- 필수 학습 · 코딩테스트 JS 스택 풀이: 크레인 인형뽑기 처리법
- 필수 학습 · 코딩테스트 JS 스택 풀이: 후위식 연산 계산하기
- 필수 학습 · 코딩테스트 JS 스택 풀이: 쇠막대기 레이저 절단 개수 세기
- 필수 학습 · 코딩테스트 JS 투 포인터 풀이: 두 정렬 배열 합치기
- 필수 학습 · 코딩테스트 JS 투 포인터 풀이: 공통 원소 추출하기
- 필수 학습 · 코딩테스트 JS 슬라이딩 윈도우 풀이: 최대 매출 구간 합 계산하기
- 필수 학습 · JavaScript 투 포인터: 합이 M인 연속 부분수열 개수
- 필수 학습 · 코딩테스트 JS 해시 풀이: 모든 아나그램 찾기
- 필수 학습 · 가장 긴 문자열 JavaScript 풀이
- 필수 학습 · 가운데 문자 출력 JavaScript 풀이
- 필수 학습 · 중복문자제거 JavaScript 풀이
- 필수 학습 · 코딩테스트 JS 고급: 최소 힙으로 다익스트라 최단 경로 구하기
- 필수 학습 · 코딩테스트 JS Union-Find: 연결 성분 수와 크기 구하기
- 필수 학습 · 코딩테스트 JS Trie: 접두사에 맞는 단어 수 세기
- 필수 학습 · 코딩테스트 JS Fenwick Tree: 값 갱신과 구간 합 처리
- 필수 학습 · 코딩테스트 JS 세그먼트 트리: 단일 대입과 구간 합
- 필수 학습 · 코딩테스트 JS LRU 캐시: 지도 타일 재사용 기록
- 필수 학습 · 코딩테스트 JS AVL 트리: 기준 이상 최솟값 찾기
- 필수 학습 · 코딩테스트 JS 큐: 상담 창구 대기열 명령 처리
- 필수 학습 · 코딩테스트 JS 연결 리스트: 재생 대기 목록 관리
- 필수 학습 · JavaScript 원형 덱 연습: 최근 기록 창과 되돌리기
- 필수 학습 · JavaScript 해시 테이블 연습: 정규화 문자열 빈도와 등장 순서
- 필수 학습 · JavaScript 트리 순회 연습: 깊이별 노드 묶기
- 필수 학습 · JavaScript BST 연습: 닫힌 구간의 중복 키 보고서
- 필수 학습 · JavaScript 최소 힙 연습: 동률 순서를 지키는 작업 스케줄러
- 필수 학습 · JavaScript 그래프 연습: 연결 구역 크기를 작은 순서로 출력하기
- 필수 학습 · 중복단어제거 JavaScript 풀이
- 필수 학습 · TypeScript 이진 탐색 연습: 숫자 카드 존재 여부 확인
- 필수 학습 · 큰 수 출력하기 JavaScript 풀이
- 필수 학습 · 보이는 학생 JavaScript 풀이
- 필수 학습 · 가위바위보 JavaScript 풀이
- 필수 학습 · 점수계산 JavaScript 풀이
새 글 받아보기
RSS 리더에서 BlogFlow의 새 글을 확인할 수 있습니다.