알고리즘 문제풀이/백준

#1448 : 삼각형 만들기

모항 2022. 1. 28. 21:44

풀이방법

사용된 것:

그리디 알고리즘

정렬

 

2022.01.28 (1)

빨대들을 모두 큰 것부터 정렬한다.

가장 긴 빨대를 1번, 가장 짧은 빨대를 N번이라 부르겠다.

 

일단 1번 빨대와 2번 빨대가 무조건 쓰일 것이라고 가정한다.

3번부터 N번까지 차례차례 살피면서, (2번빨대의 길이) + (j번째 빨대의 길이) > (1번 빨대의 길이) 인 j를 찾는다.

찾아지면 1번, 2번, j번 빨대 세 개로 만드는 삼각형의 변의 합이 정답이다.

 

위의 과정에서 N번 빨대까지 모두 살폈는데 조건에 부합하는 빨대가 없었다면,

2번 빨대와 3번 빨대가 무조건 쓰일 것이라고 가정하고 4번부터 살펴 합당한 j를 찾는다.

 

또 없었다면,

3번 빨대와 4번 빨대가 무조건 쓰일 것이라고 가정하고 5번부터 살핀다.

 

이렇게 N-2번 빨대와 N-1번 빨대가 무조건 쓰일 것이라고 가정하는 경우까지 완료했는데도 합당한 경우가 없었다면,

지금 가진 빨대로는 삼각형을 만들 수 없다. -1을 출력하면 된다.

 

이 알고리즘은 시간초과가 날 줄 알았는데 그렇지 않아 의외였다.

더 빠르게 해결하는 알고리즘이 있는지 살펴보아야겠다.

 

 

 

 

 

 

2022.01.28 (2)

위의 방법에서는 당연히 정답이 될 수 없는 케이스들을 쓸데없이 점검하였다.

 

1번 빨대, 2번 빨대, 3번 빨대가 삼각형을 만들 수 없다면,

4번 빨대 이후의 그 어떤 빨대가 3번 빨대를 대신하든 삼각형을 만들 수가 없다. 4번 이후로 모든 빨대가 3번보다 짧기 때문이다.

 

1번, 2번, 3번 빨대를 점검하고

안 되면 2번, 3번, 4번

또 안 되면 3번, 4번, 5번

...

이렇게만 점검하면 된다.

 

백준 채점 결과에서는 시간이 많이 단축되지는 않았다.

백준이 준비한 테스트케이스 중에서 이 실수에 영향을 받는 경우가 적어서일까?

백준 측도 밀리초까지 신경 쓸 필요 없다는 입장이니 그냥 코드를 효율적으로 정리했다는 점에 만족해야겠다.

 

코드

Java(2022.01.28) (1)

import java.io.InputStreamReader;
import java.io.BufferedReader;
import java.io.IOException;

import java.util.Arrays;
import java.util.Collections;

public class Main {

	public static void main(String[] args) throws IOException{
		// TODO Auto-generated method stub
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		int n = Integer.parseInt(br.readLine());	//빨대 개수
		Integer[] straws = new Integer[n];			//빨대들의 길이
		for(int i = 0; i<n; i++) {
			straws[i] = Integer.parseInt(br.readLine());
		}
		//긴 것부터 정렬
		Arrays.sort(straws, Collections.reverseOrder());

		for(int i = 0; i<n-2; i++) {
			int a = straws[i];
			int b = straws[i+1];
			
			for(int j = i+2; j<n; j++) {
				if(a<b+straws[j]) {
					System.out.print(a+b+straws[j]);
					System.exit(0);;
				}
			}
			
		}
		
		System.out.print("-1");

	}

}

Java(2022.01.28) (2)

import java.io.InputStreamReader;
import java.io.BufferedReader;
import java.io.IOException;

import java.util.Arrays;
import java.util.Collections;

public class Main {

	public static void main(String[] args) throws IOException{
		// TODO Auto-generated method stub
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		int n = Integer.parseInt(br.readLine());	//빨대 개수
		Integer[] straws = new Integer[n];					//빨대들의 길이
		for(int i = 0; i<n; i++) {
			straws[i] = Integer.parseInt(br.readLine());
		}
		
		Arrays.sort(straws, Collections.reverseOrder());

		for(int i = 0; i<n-2; i++) {
			int a = straws[i];
			int b = straws[i+1];
			int c = straws[i+2];
			if(a<b+c) {
				System.out.print(a+b+c);
				System.exit(0);;
			}
			
		}
		
		System.out.print("-1");

	}

}

'알고리즘 문제풀이 > 백준' 카테고리의 다른 글

#14425 : 문자열 집합  (0) 2022.02.14
#2606 : 바이러스  (0) 2022.02.08
#18870 : 좌표 압축  (0) 2022.01.28
#11053 : 가장 긴 증가하는 부분수열  (0) 2022.01.26
#11047 : 동전 0  (0) 2022.01.24