[Gold III] 같이 눈사람 만들래? - 20366
성능 요약
메모리: 24644 KB, 시간: 380 ms
주어진 정수의 배열에서 두 정수의 쌍을 두개 만든 후 두 쌍 간의 합의 차이가 최소가 될때 그 최소값을 출
❌ 접근 방법. 완탐
➡️ 해당 풀이법의 시간 복잡도 : → 시간 초과
⭕ 접근 방법. 완탐
➡️ 해당 풀이법의 시간 복잡도 :
⭕ 접근 방법. 투포인터
➡️ 해당 풀이법의 시간 복잡도 :
🅰️ 완탐
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.StringTokenizer;
public class Main_20366 {
static int N; // 배열의 요소 수
static int snow[]; // 눈의 높이를 저장하는 배열
static ArrayList<Snowman> snowmans; // Snowman 객체를 저장하는 ArrayList
static class Snowman implements Comparable<Snowman> {
int headSnowIdx;
int bodySnowIdx;
int height;
// Snowman 클래스의 생성자
public Snowman(int head, int body, int height) {
this.headSnowIdx = head;
this.bodySnowIdx = body;
this.height = height;
}
// 높이를 기준으로 Snowman 객체를 정렬하기 위한 compareTo 메서드 재정의
@Override
public int compareTo(Snowman o) {
return this.height - o.height;
}
}
static int min = Integer.MAX_VALUE; // 최소 높이 차이를 저장하는 변수
public static void main(String[] args) throws IOException {
// BufferedReader를 사용한 입력 처리
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
N = Integer.parseInt(br.readLine());
// 눈의 높이를 저장하는 배열 초기화
snow = new int[N];
// 눈의 높이를 읽고 배열 'snow'를 채움
StringTokenizer st = new StringTokenizer(br.readLine());
for (int i = 0; i < N; i++) {
snow[i] = Integer.parseInt(st.nextToken());
}
// Snowman 객체를 저장하는 ArrayList 초기화
snowmans = new ArrayList<>();
for (int i = 0; i < N; i++) {
for (int j = i + 1; j < N; j++) {
snowmans.add(new Snowman(i, j, snow[i] + snow[j]));
}
}
// Snowman 객체를 높이를 기준으로 정렬
Collections.sort(snowmans);
// 연속적인 Snowman 객체 간의 높이 차이를 저장하는 ArrayList 초기화
for (int i = 0; i < snowmans.size() - 1; i++) {
Snowman snowman = snowmans.get(i);
Snowman nextSnowman = snowmans.get(i + 1);
int snow1 = snowman.bodySnowIdx;
int snow2 = snowman.headSnowIdx;
int snow3 = nextSnowman.bodySnowIdx;
int snow4 = nextSnowman.headSnowIdx;
// 두 Snowman 객체가 겹치지 않을 때 높이 차이를 계산하여 최소값 갱신
if (snow1 != snow3 && snow1 != snow4 && snow2 != snow3 && snow2 != snow4) {
min = Math.min(min, nextSnowman.height - snowman.height);
}
}
// 최소 높이 차이를 출력
System.out.println(min);
}
}
🅱️ 투포인터
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Main_20366 {
static int N; // 눈의 개수
static int snow[]; // 눈의 높이를 저장하는 배열
static int min = Integer.MAX_VALUE; // 최소 높이 차이를 저장하는 변수
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
N = Integer.parseInt(br.readLine());
snow = new int[N];
StringTokenizer st = new StringTokenizer(br.readLine());
for (int i = 0; i < N; i++) {
snow[i] = Integer.parseInt(st.nextToken());
}
// 눈의 높이 배열을 정렬
Arrays.sort(snow);
// 두 개의 Snowman을 생성하고 그 높이 차이를 계산하는 중첩된 반복문
for (int i = 0; i < N; i++) {
for (int j = i + 1; j < N; j++) {
int snowMan1 = snow[i] + snow[j];
int start = 0;
int end = N - 1;
// 투 포인터를 사용하여 두 개의 Snowman 높이를 비교하고 최소 높이 차이를 찾는 루프
while (start < end) {
// 현재 포인터가 이미 사용된 눈의 인덱스와 일치하는 경우 다음 눈으로 이동
if (start == i || start == j) {
start++;
continue;
}
if (end == i || end == j) {
end--;
continue;
}
int snowMan2 = snow[start] + snow[end];
min = Math.min(min, Math.abs(snowMan1 - snowMan2));
// 높이 차이에 따라 포인터 이동
if (snowMan1 > snowMan2)
start++;
else if (snowMan1 < snowMan2)
end--;
else {
// 높이 차이가 0이면 더 이상의 계산이 필요 없으므로 0을 출력하고 종료
System.out.println(0);
return;
}
}
}
}
// 최소 높이 차이 출력
System.out.println(min);
}
}