문제 설명
https://school.programmers.co.kr/learn/courses/30/lessons/120868
내 풀이
좀 어려워서 다른 사람의 풀이를 참고한 문제였다ㅠㅠ
def solution(sides):
answer = 0
max_side = max(sides)
min_side = min(sides)
# sides에 있는 변(max_sides)이 가장 길 경우
for new_side in range (max_side - min_side + 1, max_side + 1):
answer += 1
# 새로운 변(new_side)가 가장 길 경우
for new_side in range (max_side + 1, max_side + min_side):
answer += 1
return answer
삼각형의 완성조건은
가장 긴 변의 길이 < 두 변의 길이의 함
이다.
문제에서 요구되는 삼각형을 만들 수 있는 조건은 2가지가 있다.
1. 가장 긴 변이 주어진 배열에 있는 경우(max(sides))
-> max(sides) < min(sides) + a
-> max(sides) - min(sides) < a
2. 가장 긴 변이 새로운 변인 경우
-> a < max(sides) + min(sides)
이와 같이 2가지 케이스로 나눠서 생각할 수 있다.
위의 풀이는 다음과 같다.
먼저, 주어진 배열의 최댓값과 최솟값을 각각 max_side, min_side로 지정한다.
이제 2가지 케이스로 나누어 경우의 수를 찾는다.
1. sides에 있는 변(max_sides)이 가장 긴 경우..
가장 짧은 변부터 가장 긴 변까지의 모든 가능한 경우를 계산한다.
이 경우 max(sides) - min(sides) < 가능한 값 <= max_sides
이므로, 이 범위의 값을 answer에 개수로서 추가한다!
2. 새로운 변이 가장 긴 경우..
새로운 변의 길이가 가장 길어야하기 때문에 다른 두 변의 길이의 합이 새로운 변의 길이보다 커야한다.
즉, max(sides) < 새로운 변 < max(sides) + min(sides)
이다.
따라서 주어진 범위의 for문을 돌면서 개수를 추가한다.
다른 사람 풀이
def solution(sides):
return 2 * min(sides) - 1
보고 깜짝 놀란 풀이이다;;; 수학적인 풀이라는데,,,,
이렇게 풀어야할까 싶다...
i) c가 a보다 크면 대소관계는 c > a > b가 된다.
a + b > c 이므로 a + b > c > a가 된다.
즉 이때 가능한 c의 갯수는 b - 1개
ii) c가 a보다 작으면 대소관계는 a > b, a > c 가 된다.
b + c > a 이므로 b + c > a > c가 된다.
즉 이때 가능한 c의 갯수는 b - 1개
iii) c와 a가 같으면 c = a 한 가지 밖에 존재하지 않는다.
그러므로 다 합하면 (b - 1) + (b - 1) + 1 = 2 * b - 1 개가 된다.
이때 초기 조건에 따라 b는 a보다 작다.
느낀점
다른 사람들이 푼 풀이가 정말 어이없었던 풀이였다;;
꼭 그렇게 풀어야할까 생각이 든다.
'코딩테스트 > PYTHON' 카테고리의 다른 글
[프로그래머스][PYTHON] Lv. 0 등수 매기기 (0) | 2024.03.20 |
---|---|
[프로그래머스][PYTHON] Lv. 0 이진수 더하기 (0) | 2024.03.20 |
[프로그래머스][PYTHON] Lv. 0 저주의 숫자 3 (0) | 2024.03.19 |
[프로그래머스][PYTHON] Lv. 0 k의 개수 (0) | 2024.03.19 |
[프로그래머스][PYTHON] Lv. 0 외계어 사전 (0) | 2024.03.16 |