문제
같은 길이의 성냥개비가 여러 개 주어져 있다. 이것들을 평면에 늘어놓아서 삼각형을 만들려고 한다. 삼각형의 한 변은 여러 개의 성냥개비를 직선으로 이어서 만들 수 있지만, 성냥개비를 꺾거나 잘라서 변의 한 부분을 만들 수는 없다. 성냥개비의 개수가 주어졌을 때, 이들 성냥개비를 사용하여 만들 수 있는 서로 다른 삼각형의 개수를 구하는 프로그램을 작성하시오.
예를 들어서 9개의 성냥개비로 만들 수 있는 서로 다른 삼각형은 그림 1과 같이 3가지이다.
주의사항
- 주어진 성냥개비는 모두 사용하여 하나의 삼각형을 만들어야 한다.
- 삼각형을 한 개도 만들 수 없으면 0을 출력한다. 예를 들어서, 주어진 성냥개비의 수가 1, 2, 또는 4인 경우에는 삼각형을 한 개도 만들 수 없다.
- 합동인 삼각형들은 같은 삼각형으로 본다. 예를 들어서 성냥개비 5개를 사용하여 만들수 있는 그림 2의 삼각형들은 같은 삼각형으로 본다.
입력
첫째 줄에 성냥개비의 개수가 주어진다. 성냥개비의 개수는 1 이상 50,000 이하이다.
출력
첫째 줄에 만들 수 있는 삼각형의 개수를 출력한다.
예제 입력
1
9
예제 출력
1
3
풀이과정
처음에는 2중 반복문을 통해 입력받은 성냥개비 개수(n)로 삼각형 세변의 조건을 통해 가능한 경우의 수들을 배열에 저장하고, 중복이 있다면 제거하는 방법을 사용했는데, 시간 초과가 나왔다.
이 문제는 제한 시간이 1초로 O(N)의 시간 복잡도를 가지는 알고리즘으로 풀어야 하는데, 처음에 짠 알고리즘은 O(N^2)의 시간복잡도를 가지고 있었다.
어떻게 하면 효율적으로 시간을 단축시킬 수 있을까 고민해봤는데, 삼각형의 가장 긴 변은 n/2 보다 작아야 하고, n/3 보다는 크거나 같아야 된다는 조건과 가장 짧은 변은 1보다 크거나 같고, n에서 가장 긴변을 뺀 값의 1/2 보다 작아야한다는 조건을 구하고 이를 적용해서 알고리즘을 다시 짜보았다.

