DSA

프로그래머스 삼각형의 완성조건 (2) - C# 풀이

김스택 2024. 1. 21. 13:29

문제 출처

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;
    }
}

 

  1. 주어진 두 선분을 작은 것과 큰 것으로 구분합니다. sidesSmall, sidesLarge
  2. 세 선분의 길이 중 sidesLarge가 가장 클 때를 가정하고 계산합니다.
  3. 세 선분의 길이 중 미지수가 가장 클 때를 가정하고 계산합니다.
  4. 3번과 4번을 합산하여 result를 계산합니다.

 

최적화 방안 첫 번째

int sidesSmall = Math.min(sides[0], sides[1]);
int sidesLarge = Math.max(sides[0], sides[1]);

 

Math.MinMath.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)를 계산합니다. 이를 통해 불필요한 반복을 제거하고, 삼각형 부등식을 만족하는 모든 가능한 변의 길이를 쉽게 구할 수 있습니다.

 

삼각 부등식
[삼각형의 세 변의 길이 사이의 관계]
(나머지 두 변의 길이의 차) < (한 변의 길이) < (나머지 두 변의 길이의 합)

 

삼각 부등식에 대한 설명. 출처 :&nbsp;https://www.youtube.com/watch?v=KlKYvbigBqs

 

최종 풀이

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;
            }
        }
    }
}

 

 

자료 출처