선분 세 개로 삼각형을 만들기 위해서는 다음과 같은 조건을 만족해야 합니다.
삼각형의 두 변의 길이가 담긴 배열 sides이 매개변수로 주어집니다. 나머지 한 변이 될 수 있는 정수의 개수를 return하도록 solution 함수를 완성해주세요.
❗️제한사항
sides | result |
---|---|
[1, 2] | 1 |
[3, 6] | 5 |
[11, 7] | 13 |
❗️설명
1번 예시
두 변이 1, 2 인 경우 삼각형을 완성시키려면 나머지 한 변이 2여야 합니다. 따라서 1을 return합니다.
2번 예시
3번 예시
삼각형의 조건이고 뭐고 다 모르겠고, 예시 설명에 초점을 두고 풀었다.
2번 예시의 경우, input이 [3, 6]
일 때, 될 수 있는 변의 길이는 4 ~ 8
이다.
3번 예시의 경우, input이 [11, 7]
일 때, 될 수 있는 변의 길이는 5 ~ 17
이다.
input의 큰 값을 longer, 작은 값을 shorter로 둔다고 했을 경우,
될 수 있는 변의 길이는 longer-shorter+1 ~ longer+shorter-1
의 범위 값이다.
이거 말고는 생각이 안나서 IntStream.range()를 활용해서 문제를 풀었다.
IntStream.range()
로 변의 길이가 될 수 있는 값들을 가져와서 총 요소의 개수를 세어주고 반환하면 된다!
오늘은 삽질까진 아니지만!
처음에 longer와 shorter의 값을 정해줄 때, Math.max()/Math.min()
함수를 적당히 쓰고 싶었는데,
이 문제에서 사용하려면 sides의 첫 번째 인자와 두 번째 인자를 직접 넣어줘야 했다.
하드코딩이 싫어서 처음에는 stream의 max()를 쓰는 거로 코딩을 했었다.
근데 다른 사람들이 제출한 걸 봤더니 다들 Math.max()를 잘 사용하고 있더라,,,
그래서 나도 냅다 바꿨다!
확실히 빠르기도 하고, 어차피 두 개 요소밖에 없으니까 크게 문제될 것도 없긴 하다!
그저 직접 지정해주는 코드가 아쉬울 뿐
근데 뭐 어땨용? 빠르면 장땡
import java.util.stream.IntStream;
public class Triangle2 {
public int solution(int[] sides) {
int longer = Math.max(sides[0], sides[1]);
int shorter = Math.min(sides[0], sides[1]);
// range(num1, num2) -> num1 ~ (num2-1) 까지 반환
return (int)IntStream.range(longer-shorter+1, longer+shorter).count();
}
public static void main(String[] args) {
Triangle2 triangle2 = new Triangle2();
System.out.println(triangle2.solution(new int[]{1, 2})); // 1
System.out.println(triangle2.solution(new int[]{3, 6})); // 5
System.out.println(triangle2.solution(new int[]{11, 7})); // 13
}
}