백준 14215번 풀이

문제

막대기 세 개가 주어졌을 때, 이걸로 만들 수 있는 삼각형의 최대 둘레는?

풀이

이 문제 보자마자 본인 표정:

근데 이 문제, 막상 풀어보면 쉽다. 아니 진짜 쉽다니까요? 앞에서 풀었던 세 변으로 삼각형 판별하는 문제에 나왔던 부등식만 기억하면 진짜 금방 풀린다. 삼각형 부등식에서 제일 긴 변 >= 나머지 두 변 길이의 합이면 삼각형이 성립 안 된다고 했잖아요? 요것만 딱 기억하시면 됨.

import sys

byeon = list(map(int,sys.stdin.readline().split()))

뭐야 배열로 가져와요? 예, 배열로 가져옵니다. 왜냐하면 제일 긴 변이 필요하거든…

import sys

byeon = list(map(int,sys.stdin.readline().split()))
byeon.sort()

정렬까지 하면 준비는 끝났다. 이렇게 하면 제일 긴 변은 해당 배열의 맨 끝이 되니까, 로직만 짜면 된다.

이 문제에서 로직을 어떻게 짤 거냐… 간단하다. 제일 긴 변이 나머지 두 변의 합보다 크거나 같으면 후가공 절차를 들어가고, 아니면 그대로 리스트 합을 출력하면 된다. 2, 2, 2는 2 < 2+2이기때문에 그냥 합을 통으로 더하면 되지만, 만약 4 2 2라면 4 = 2+2니까 후가공 절차가 필요하다.

import sys

byeon = list(map(int,sys.stdin.readline().split()))
byeon.sort()

if byeon[2] >= byeon[1] + byeon[0]:
    byeon[2] = byeon[1] + byeon[0] - 1
    print(sum(byeon))
else: 
    print(sum(byeon))

자 생각해봅시다. 나머지 두 변의 합보다 작으면 삼각형이 성립된다. 예시에 나왔던 1 100 1도 다른 두 변의 합인 2보다 작은 정수, 1로 잘라서 1+1+1 해서 3이다. 그니까 제일 긴 변이 나머지 두 변의 합보다 크거나 같으면, 나머지 두 변의 길이의 합에서 1을 뺀 만큼만 남기고 막대기를 자르면 된다. 그죠?