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 이라는 수식을 통해서 구할 수 있기 때문에
위와 같은 프로그램을 작성할 수 있는 것이다.
'알고리즘 > 프로그래머스' 카테고리의 다른 글
Lv 0. 저주의 숫자 3 (0) | 2023.10.07 |
---|---|
Lv 0. 외계어 사전 - string 속에서 string을 찾으려면 find() 함수를, 못찾으면 string::npos를 떠올리자. *다시 풀어보기* (0) | 2023.10.06 |
Lv 0. 안전지대 (0) | 2023.10.06 |
Lv 0. 숨어있는 숫자의 덧셈 (2) (0) | 2023.10.06 |
Lv 0. 다항식 더하기 *다시 풀어보기* (0) | 2023.10.06 |