Lv 0. 삼각형의 완성조건 (2)

https://school.programmers.co.kr/learn/courses/30/lessons/120868

 

#include <string>
#include <vector>

using namespace std;

int solution(vector<int> sides) {
    int answer = 0;
    int a=sides[0];
    int b=sides[1];
    for(int i=1; i< a+b; i++){
        if(a<i+b && b<i+a) answer++;
    }
    return answer;
}

위와 같은 풀이를 작성하였다. 

 

이때에 다른 사람의 풀이를 참고해보니, 수학적인 대소관계 비교를 통해서 아주 재미있는 풀이를 한 사람들이 있어서, 해당 풀이를 첨부해본다.

#include <iostream>
#include <vector>
using namespace std;

int solution(vector<int> v)
{
    if(v[0] < v[1])
        swap(v[0],v[1]);
    return v[1] * 2 - 1;
}

위와 같은 풀이인데, 이때에 이 풀이에 대해서 바로 이해가 가지 않아서 해당 풀이를 설명해주는 블로그 주소를 들어가게 되어서 해당 내용을 읽어보았고 해당 블로그를 첨부한다. 

https://tnsgh9603.tistory.com/137

 

[Programmers] 삼각형의 완성조건 (2)

https://school.programmers.co.kr/learn/courses/30/lessons/120868?language=python3' 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술

tnsgh9603.tistory.com

 

위 블로그에서 제시하는 바로는, 결국에는 a>b 라는 조건이 있는 상황에서,

c의 경우가

1) a보다 큰 경우

2 a와 같은 경우

3) a보다 작은 경우

 

의 세가지 경우로 나누어 볼 수 있을텐데, 

각각의 경우 삼각형을 이루기 위한 조건과, a와 c의 대소에 대한 조건을 같이 엮어보면 나오는 범위의 형태가, 

1) a + b > c > a  =>

변의 길이가 정수인 경우들에 대해서 얘기하고 있으므로, 

a+b -1>= c >a-1;  사이에 존재하는 정수의 갯수를 구하면 되고, 해당 갯수는

 a+b -1 -(a-1) +1 로 나타낼 수 있고, 값은 (b-1)개

 

2) a==c 인 경우기므로, 주어지는 a의 값과 같은 정수의 갯수는 한개이다. (b의 값은 여러개가 나올 수 있는 상황이다)

 

3) b+c >a > c  => 

b>a-c>0 

b-a> -c > -a

a-b<c<a 이므로, 

a-b+1<= c <= a-1 을 만족하는 정수들의 갯수는, 

a-1 - (a-b+1) +1 개이고, 이 값은 (b-1)개 이다. 

 

* 세가지 경우들의 값인 b-1, 1, b-1 을 모두 합치면, 2b-1의 값이 나온다. 

결국 두 변의 값이 주어지면, 둘중 가장 작은 변의 값 b를 통해서 c가 가능한 경우들을 2b-1 이라는 수식을 통해서 구할 수 있기 때문에

위와 같은 프로그램을 작성할 수 있는 것이다. 

 

 

 

  Comments,     Trackbacks