[BOJ] 14658번: 하늘에서 별똥별이 빗발친다 (Java)
문제 (Gold 4)
풀이
N과 M의 범위가 500,000까지이므로, 이를 모두 완전탐색하면 시간초과가 난다.
하지만, K의 개수는 100개 이하이기 때문에 K를 이용해서 탐색을 진행하면 된다.
위의 사진은 문제 예시를 좌표에 나타낸 것이다.
별들을 이중 for문으로 돌며, 각각에서 x좌표 y좌표를 추출하여 그 범위를 탐색한다.
빨간색 점은 각 번호에서 추출된 x, y좌표를 나타내고 이를 좌상단으로 하여 L*L만큼의 범위를 탐색하면 된다.
별들이 모서리에 존재하게 할 수록, 더 많은 별들을 포함할 수 있다는 관점이다.
위 예시의 경우에서는 5번 점의 x를 추출하고 2번점의 y를 추출한 빨간 점에서 트램펄린을 놓았을 때,
가장 많은 별을 포함하게 된다는 것을 알 수 있다!
코드
package bruteForce;
import java.util.*;
import java.io.*;
public class BOJ_14658_하늘에서별똥별이빗발친다 {
static int N, M, L, K;
static List<int[]> stars;
public static void main(String[] args) throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
L = Integer.parseInt(st.nextToken());
K = Integer.parseInt(st.nextToken());
stars = new ArrayList<>();
for(int i =0 ; i < K ; i++){
st = new StringTokenizer(br.readLine());
int x = Integer.parseInt(st.nextToken());
int y = Integer.parseInt(st.nextToken());
stars.add(new int[]{x, y});
}
int res = Integer.MIN_VALUE;
for(int[] s1: stars){
for(int[] s2: stars){
res = Math.max(res, boundStar(s1[0], s2[1]));
}
}
System.out.println(K-res);
}
private static int boundStar(int i, int j) {
int res = 0;
for(int[] s:stars){
if(i<=s[0]&&s[0]<=i+L && j<=s[1]&&s[1]<=j+L ) res++;
}
return res;
}
}
제출
500,000*500,000을 완탐하려 해서 실패! ( ~안되는건 알지만 혹시나~해서 트라이!~ )
Author And Source
이 문제에 관하여([BOJ] 14658번: 하늘에서 별똥별이 빗발친다 (Java)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@dot2__/BOJ-14658번-하늘에서-별똥별이-빗발친다-Java저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)