Apple is Apple

1. 문제 설명

찬우는 친구들과 고양이 카페에 가려 한다.

고양이 카페에는 N마리의 고양이가 있다. i번째 고양이의 무게는 w_i이다. 찬우와 친구들은 모두 고양이를 사랑하기 때문에 무릎 위에 고양이를 정확히 2마리 데리고 있으면 행복해진다. 하지만 허약한 찬우와 친구들은 데리고 있는 두 고양이의 무게의 합이 k를 넘는다면 버티지 못할 것이다.

각 고양이의 무게와 한 명이 버틸 수 있는 최대 무게 k가 주어질 때 최대 몇 명이 행복해질 수 있는지 구해보자.

2. 입출력 예

입력

첫째 줄에 정수 N과 K가 공백으로 구분되어 주어진다. ( 1 <= N <= 5000 1 <= K <=

둘째 줄에는 각 고양이의 무게를 의미하는 N개의 정수 w1,w2,⋯,이 공백으로 구분되어 주어진다. (1≤ wi ≤K)

 

출력    

행복해질 수 있는 사람의 수의 최댓값을 출력한다.

 
 

3. 코드

<kotlin />
import java.io.BufferedWriter import java.io.OutputStreamWriter import java.util.* val bw = BufferedWriter(OutputStreamWriter(System.out)) fun closeBW() { bw.flush() bw.close() } fun main() = with(System.`in`.bufferedReader()) { val (n, k) = readLine().split(" ").map { it.toInt() } val list = readLine().split(" ").map { it.toInt() }.sorted() var res = 0 var start = 0 var end = n - 1 while (start < end) { if (list[start] + list[end] <= k) { start++ end-- res++ } else { end-- } } bw.write("$res") closeBW() close() }

 

4. 풀이

최대 무게 K를 버틸 수 있는 2개의 값을 찾는 문제이다.

리스트의 크기가 5000로 이중 for문을 사용하게 되면 5000 * 5000 = 25,000,000 회의 연산이 ( O(n^2))필요하므로 투포인터를 사용하여 시간복잡도를 낮춘다. ( O(N) )

 

start와 end를 통해 양 끝에 포인터를 주어 포인터를 좁혀가며 K의 값을 만족하는 값을 찾는다.

찾지 못하면 start와 end가 만날 때까지 값을 줄여가며 값을 찾는다.

5.  

profile

Apple is Apple

@mjjjjjj