-
Codility - TriangleAlgorithm 2022. 11. 15. 16:22
아래 문제는 코딜리티에서 제공하는 Sorting > Triangle의 문제입니다🧑🏻💻
문제 제시
더보기An array A consisting of N integers is given. A triplet (P, Q, R) is triangular if 0 ≤ P < Q < R < N and:
- A[P] + A[Q] > A[R],
- A[Q] + A[R] > A[P],
- A[R] + A[P] > A[Q].
For example, consider array A such that:
A[0] = 10 A[1] = 2 A[2] = 5 A[3] = 1 A[4] = 8 A[5] = 20
Triplet (0, 2, 4) is triangular.
Write a function:
public func solution(_ A : inout [Int]) -> Int
that, given an array A consisting of N integers, returns 1 if there exists a triangular triplet for this array and returns 0 otherwise.
For example, given array A such that:
A[0] = 10 A[1] = 2 A[2] = 5 A[3] = 1 A[4] = 8 A[5] = 20
the function should return 1, as explained above. Given array A such that:
A[0] = 10 A[1] = 50 A[2] = 5 A[3] = 1
the function should return 0.
Write an efficient algorithm for the following assumptions:
- N is an integer within the range [0..100,000];
- each element of array A is an integer within the range [−2,147,483,648..2,147,483,647].
문제 풀이
public func solution(_ A : inout [Int]) -> Int { let input = A.sorted(by: >) let count = input.count for i in 0..<count { if i + 3 <= count { if input[i] < input[i+1] + input[i+2] { return 1 } } } return 0 }
사용 개념
- sort
- 삼각형 공식
- 삼항비 / 삼항자
문제 후기
해당 문제는 삼각형의 기본 원리만 알면 쉽게 해결할 수 있는 문제였습니다.
특정하게 말을 한다면 삼각형의 성립 조건만 알면 해결 할 수 있죠.
삼각형의 조건은 가장 긴변의 길이보다 나머지 두변의 길이의 합이 항상 더 커야합니다.
즉 이 개념만 머릿속에 있다면 가보자구요!
배열에 들어온것을 큰 수부터 정렬해줍니다.
가장 긴변이 될 확률이 높은 수부터 아래 두 두변의 합을 비교해주면되요.
항상 가장 큰 수들의 합이 확률적으로 만들어질 확률이 가장 크니 1,2,7번 인덱스의 값을 비교할 필요가 없죠.
즉 순차적으로 연결된 값들만 비교해도 충분합니다.
그런다면 이제 반복을 돌아주며 조건을 비교하면 됩니다.
out index 오류를 내지 않도록 i+3 <= count라는 조건까지 넣어줘야 안전하게 실패하지 않습니다.
만약 삼각형을 만드는 조건이 달성되면 곧바로 1을 리턴하고 다 돌았는데도 없다면 0을 리턴해주면 됩니다.
[참고 자료]
https://app.codility.com/programmers/lessons/6-sorting/triangle/
'Algorithm' 카테고리의 다른 글
프로그래머스 - 귤 고르기 (0) 2022.12.06 프로그래머스 - 점 찍기 (0) 2022.12.03 Codility - MaxProductOfThree (0) 2022.11.09 LeetCode - Palindrome Number (0) 2022.01.07 LeetCode - Suffle an Array (0) 2021.12.13