반응형
문제 출처
https://school.programmers.co.kr/learn/courses/30/lessons/120868
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
✅ 문제 개요
두 개의 선분 길이가 주어졌을 때, 삼각형을 만들기 위해 가능한 세 번째 변의 길이의 개수를 구하는 문제입니다.
삼각형이 성립하려면:
- 어떤 한 변의 길이는 나머지 두 변의 길이의 합보다 작아야 합니다.
세 변을 a, b, c라고 할 때, 다음 조건이 반드시 성립해야 합니다:
a + b > c
b + c > a
c + a > b
이 문제에서는 두 변 a, b만 주어지고, 가능한 세 번째 변 x의 개수를 구해야 합니다.
예시
sides 가능한 x의 개수
[1, 2] | 1 |
[3, 6] | 5 |
[11, 7] | 13 |
문제 해결 원리
🔹 삼각형 조건 해석
세 변이 a, b, x라고 할 때:
- x가 가장 긴 변이라면: x < a + b
- x가 가장 짧은 변이라면: x > |a - b|
따라서 가능한 x의 범위는 다음과 같습니다:
|a - b| < x < a + b
정수의 개수를 구해야 하므로, 위 조건을 정수 범위로 바꾸면:
(abs(a - b) + 1) <= x <= (a + b - 1)
이 범위 내에 포함되는 정수의 개수가 정답이 됩니다.
✅ 절댓값 abs의 사용 이유
예를 들어 a가 3이고 b가 6이라면, 차이는 6 - 3 = 3입니다. 그러나 입력이 [6, 3] 혹은 [3, 6]일 수 있으므로, 누가 더 큰지 판단하지 않고 항상 양수 차이를 구해야 합니다.
이를 위해 abs(a - b)를 사용하여 절댓값을 통해 안전하게 계산합니다.
✅ +1과 -1이 포함된 이유
우리가 구하는 범위는:
|a - b| < x < a + b
이때 x는 정수이므로 다음과 같이 바뀝니다:
(abs(a - b) + 1) <= x <= (a + b - 1)
여기서:
- +1은 "보다 크다"를 정수 기준으로 표현하기 위한 것이며
- -1은 "보다 작다"를 정수 기준으로 표현하기 위한 것입니다
즉, 정확한 정수 범위를 계산하기 위해 이 두 연산이 필요합니다.
🧱 코드 작성 과정 요약
- 최댓값 계산: a + b - 1
- 세 번째 변 x는 a + b보다 작아야 하므로 마지막 정수는 a + b - 1
- 최솟값 계산: abs(a - b) + 1
- x는 |a - b|보다 커야 하므로 첫 정수는 abs(a - b) + 1
- 가능한 정수 개수 계산:
- (최댓값 - 최솟값 + 1)이 되며,
- 이를 수식으로 간단히 하면: (a + b - 1) - abs(a - b)
- 파이썬 코드 구현:
def solution(sides):
return (sum(sides) - 1) - abs(sides[0] - sides[1])
🔢 예제 검증
예제 1: sides = [1, 2]
- 최솟값: |1 - 2| + 1 = 2
- 최댓값: 1 + 2 - 1 = 2
- 가능한 x: [2] → 정답: 1
예제 2: sides = [3, 6]
- 최솟값: |3 - 6| + 1 = 4
- 최댓값: 3 + 6 - 1 = 8
- 가능한 x: [4, 5, 6, 7, 8] → 정답: 5
예제 3: sides = [11, 7]
- 최솟값: |11 - 7| + 1 = 5
- 최댓값: 11 + 7 - 1 = 17
- 가능한 x: [5, 6, ..., 17] → 정답: 13
✅ 최종 코드 요약
def solution(sides):
return (sum(sides) - 1) - abs(sides[0] - sides[1])
✅ 핵심 정리
항목 설명
삼각형 조건 | 어떤 한 변은 나머지 두 변의 합보다 작아야 함 |
가능한 x 범위 | ` |
abs 사용 이유 | 두 변 중 어느 쪽이 큰지 몰라도 정확하게 계산하기 위해 필요 |
+1 / -1 이유 | "보다 크다/작다"를 정수로 반영하기 위한 보정 |
정답 계산식 | (a + b - 1) - abs(a - b) |
반응형
'IT > CodingTest' 카테고리의 다른 글
[programmers] '등수 매기기' 문제 해설 및 정답코드 (0) | 2025.03.27 |
---|---|
[programmers] 'OX퀴즈' 문제를 가장 간단하게 푸는 방법 (0) | 2025.03.27 |
[programmers] '영어가 싫어요' 문제 해설 및 정답코드 (0) | 2025.03.25 |
[programmers] '공 던지기' 문제 해설 및 정답코드 (0) | 2025.03.20 |
[programmers] '2차원으로 만들기' 문제해설 (0) | 2025.03.18 |
[programmers] '주사위의 개수' 문제해설 (0) | 2025.03.17 |
[programmers] '외계행성의 나이' 문제 간단하게 풀기 (1) | 2025.02.27 |
[programmers] '가위 바위 보' 문제를 푸는 여러 가지 방법 (0) | 2025.02.25 |
댓글