프로그래머스 삼각형의 완성조건 (2) - C# 풀이
문제 출처
https://school.programmers.co.kr/learn/courses/30/lessons/120868
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
초기 접근
처음 접근 방식은 두 변의 길이를 받아, 가능한 세 번째 변의 길이를 직접 계산하는 것이었습니다. 이를 위해 두 경우를 고려하였습니다: 하나는 이미 주어진 두 변 중 더 긴 변이 가장 긴 변일 때, 다른 하나는 계산해야 할 세 번째 변이 가장 긴 변일 때입니다.
public class Solution
{
public int solution(int[] sides)
{
int answer = 0;
int sidesSmall = sides[0];
int sidesLarge = sides[1];
if (sidesSmall > sidesLarge)
{
int temp = sidesSmall;
sidesSmall = sidesLarge;
sidesLarge = temp;
}
for (int i = 1; i <= 1000; i++)
{
// sidesLarge가 가장 긴 변일 때
if (sidesSmall + i > sidesLarge && i <= sidesLarge)
{
answer++;
}
// 계산해야 할 세번째 변이 가장 긴 변일 때
if (sidesSmall + sidesLarge > i && sidesLarge < i)
{
answer++;
}
}
return answer;
}
}
- 주어진 두 선분을 작은 것과 큰 것으로 구분합니다. sidesSmall, sidesLarge
- 세 선분의 길이 중 sidesLarge가 가장 클 때를 가정하고 계산합니다.
- 세 선분의 길이 중 미지수가 가장 클 때를 가정하고 계산합니다.
- 3번과 4번을 합산하여 result를 계산합니다.
최적화 방안 첫 번째
int sidesSmall = Math.min(sides[0], sides[1]);
int sidesLarge = Math.max(sides[0], sides[1]);
Math.Min과 Math.Max를 사용하여 코드를 단순화하고, 두 변 중 어느 것이 더 긴지 즉시 판단할 수 있습니다. 이는 코드의 가독성을 높이고 오류 가능성을 줄입니다.
sides.Max()와 같이 LINQ를 사용하는 방법도 고려해 보았으나, Math.Max(sides[0], sides[1])는 두 개의 요소만 비교하기 때문에 sides.Max()보다 성능이 더 좋다고 판단했습니다. 배열의 크기가 고정되어 있고 매우 작기 때문에, Math.Max가 더 최적화된 선택으로 보입니다.
최적화 방안 두 번째
int minThirdSide = sidesLarge - sidesSmall + 1;
int maxThirdSide = sidesLarge + sidesSmall - 1;
int possibleSidesCount = maxThirdSide - minThirdSide + 1;
return possibleSidesCount;
세 번째 변의 가능한 최소 길이(minThirdSide)와 최대 길이(maxThirdSide)를 계산합니다. 이를 통해 불필요한 반복을 제거하고, 삼각형 부등식을 만족하는 모든 가능한 변의 길이를 쉽게 구할 수 있습니다.
삼각 부등식
[삼각형의 세 변의 길이 사이의 관계]
(나머지 두 변의 길이의 차) < (한 변의 길이) < (나머지 두 변의 길이의 합)
최종 풀이
namespace Triangle_Completion_Conditions
{
internal class Program
{
static void Main(string[] args)
{
Solution solution = new Solution();
Console.WriteLine(solution.solution([1, 2]));
Console.WriteLine(solution.solution([3, 6]));
Console.WriteLine(solution.solution([11, 7]));
}
public class Solution
{
public int solution(int[] sides)
{
int sidesSmall = Math.Min(sides[0], sides[1]);
int sidesLarge = Math.Max(sides[0], sides[1]);
int minThirdSide = sidesLarge - sidesSmall + 1;
int maxThirdSide = sidesLarge + sidesSmall - 1;
int possibleSidesCount = maxThirdSide - minThirdSide + 1;
return possibleSidesCount;
}
}
}
}